{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Stacked LSTMs for Time Series Classification with TensorFlow"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We'll now build a slightly deeper model by stacking two LSTM layers using the Quandl stock price data. Furthermore, we will include features that are not sequential in nature, namely indicator variables for identifying the equity and the month."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Imports"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T00:40:11.940486Z",
     "start_time": "2020-06-22T00:40:11.937588Z"
    }
   },
   "outputs": [],
   "source": [
    "import warnings\n",
    "warnings.filterwarnings('ignore')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T00:40:13.584330Z",
     "start_time": "2020-06-22T00:40:11.944065Z"
    }
   },
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "\n",
    "from pathlib import Path\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "from scipy.stats import spearmanr\n",
    "from sklearn.metrics import roc_auc_score\n",
    "\n",
    "import tensorflow as tf\n",
    "from tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping\n",
    "from tensorflow.keras.models import Model\n",
    "from tensorflow.keras.layers import Dense, LSTM, Input, concatenate, Embedding, Reshape, BatchNormalization\n",
    "import tensorflow.keras.backend as K\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T00:40:13.614311Z",
     "start_time": "2020-06-22T00:40:13.585837Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Using GPU\n"
     ]
    }
   ],
   "source": [
    "gpu_devices = tf.config.experimental.list_physical_devices('GPU')\n",
    "if gpu_devices:\n",
    "    print('Using GPU')\n",
    "    tf.config.experimental.set_memory_growth(gpu_devices[0], True)\n",
    "else:\n",
    "    print('Using CPU')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T00:40:13.629790Z",
     "start_time": "2020-06-22T00:40:13.615656Z"
    }
   },
   "outputs": [],
   "source": [
    "idx = pd.IndexSlice\n",
    "sns.set_style('whitegrid')\n",
    "np.random.seed(42)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T00:40:13.659339Z",
     "start_time": "2020-06-22T00:40:13.631071Z"
    }
   },
   "outputs": [],
   "source": [
    "results_path = Path('results', 'lstm_embeddings')\n",
    "if not results_path.exists():\n",
    "    results_path.mkdir(parents=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Data"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Data produced by the notebook [build_dataset](00_build_dataset.ipynb)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T00:40:14.303606Z",
     "start_time": "2020-06-22T00:40:13.661226Z"
    }
   },
   "outputs": [],
   "source": [
    "data = pd.read_hdf('data.h5', 'returns_weekly')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T00:40:14.359654Z",
     "start_time": "2020-06-22T00:40:14.305436Z"
    }
   },
   "outputs": [],
   "source": [
    "data['ticker'] = pd.factorize(data.index.get_level_values('ticker'))[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T00:40:14.673691Z",
     "start_time": "2020-06-22T00:40:14.361521Z"
    }
   },
   "outputs": [],
   "source": [
    "data['month'] = data.index.get_level_values('date').month\n",
    "data = pd.get_dummies(data, columns=['month'], prefix='month')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T00:40:14.850346Z",
     "start_time": "2020-06-22T00:40:14.674875Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "MultiIndex: 1167341 entries, ('A', Timestamp('2009-01-11 00:00:00')) to ('ZUMZ', Timestamp('2017-12-31 00:00:00'))\n",
      "Data columns (total 67 columns):\n",
      " #   Column       Non-Null Count    Dtype  \n",
      "---  ------       --------------    -----  \n",
      " 0   fwd_returns  1167341 non-null  float64\n",
      " 1   1            1167341 non-null  float64\n",
      " 2   2            1167341 non-null  float64\n",
      " 3   3            1167341 non-null  float64\n",
      " 4   4            1167341 non-null  float64\n",
      " 5   5            1167341 non-null  float64\n",
      " 6   6            1167341 non-null  float64\n",
      " 7   7            1167341 non-null  float64\n",
      " 8   8            1167341 non-null  float64\n",
      " 9   9            1167341 non-null  float64\n",
      " 10  10           1167341 non-null  float64\n",
      " 11  11           1167341 non-null  float64\n",
      " 12  12           1167341 non-null  float64\n",
      " 13  13           1167341 non-null  float64\n",
      " 14  14           1167341 non-null  float64\n",
      " 15  15           1167341 non-null  float64\n",
      " 16  16           1167341 non-null  float64\n",
      " 17  17           1167341 non-null  float64\n",
      " 18  18           1167341 non-null  float64\n",
      " 19  19           1167341 non-null  float64\n",
      " 20  20           1167341 non-null  float64\n",
      " 21  21           1167341 non-null  float64\n",
      " 22  22           1167341 non-null  float64\n",
      " 23  23           1167341 non-null  float64\n",
      " 24  24           1167341 non-null  float64\n",
      " 25  25           1167341 non-null  float64\n",
      " 26  26           1167341 non-null  float64\n",
      " 27  27           1167341 non-null  float64\n",
      " 28  28           1167341 non-null  float64\n",
      " 29  29           1167341 non-null  float64\n",
      " 30  30           1167341 non-null  float64\n",
      " 31  31           1167341 non-null  float64\n",
      " 32  32           1167341 non-null  float64\n",
      " 33  33           1167341 non-null  float64\n",
      " 34  34           1167341 non-null  float64\n",
      " 35  35           1167341 non-null  float64\n",
      " 36  36           1167341 non-null  float64\n",
      " 37  37           1167341 non-null  float64\n",
      " 38  38           1167341 non-null  float64\n",
      " 39  39           1167341 non-null  float64\n",
      " 40  40           1167341 non-null  float64\n",
      " 41  41           1167341 non-null  float64\n",
      " 42  42           1167341 non-null  float64\n",
      " 43  43           1167341 non-null  float64\n",
      " 44  44           1167341 non-null  float64\n",
      " 45  45           1167341 non-null  float64\n",
      " 46  46           1167341 non-null  float64\n",
      " 47  47           1167341 non-null  float64\n",
      " 48  48           1167341 non-null  float64\n",
      " 49  49           1167341 non-null  float64\n",
      " 50  50           1167341 non-null  float64\n",
      " 51  51           1167341 non-null  float64\n",
      " 52  52           1167341 non-null  float64\n",
      " 53  label        1167341 non-null  int64  \n",
      " 54  ticker       1167341 non-null  int64  \n",
      " 55  month_1      1167341 non-null  uint8  \n",
      " 56  month_2      1167341 non-null  uint8  \n",
      " 57  month_3      1167341 non-null  uint8  \n",
      " 58  month_4      1167341 non-null  uint8  \n",
      " 59  month_5      1167341 non-null  uint8  \n",
      " 60  month_6      1167341 non-null  uint8  \n",
      " 61  month_7      1167341 non-null  uint8  \n",
      " 62  month_8      1167341 non-null  uint8  \n",
      " 63  month_9      1167341 non-null  uint8  \n",
      " 64  month_10     1167341 non-null  uint8  \n",
      " 65  month_11     1167341 non-null  uint8  \n",
      " 66  month_12     1167341 non-null  uint8  \n",
      "dtypes: float64(53), int64(2), uint8(12)\n",
      "memory usage: 507.8+ MB\n"
     ]
    }
   ],
   "source": [
    "data.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Train-test split\n",
    "\n",
    "To respect the time series nature of the data, we set aside the data at the end of the sample as hold-out or test set. More specifically, we'll use the data for 2017."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T00:40:14.860010Z",
     "start_time": "2020-06-22T00:40:14.851760Z"
    }
   },
   "outputs": [],
   "source": [
    "window_size=52\n",
    "sequence = list(range(1, window_size+1))\n",
    "ticker = 1\n",
    "months = 12\n",
    "n_tickers = data.ticker.nunique()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T00:40:15.416748Z",
     "start_time": "2020-06-22T00:40:14.861151Z"
    }
   },
   "outputs": [],
   "source": [
    "train_data = data.drop('fwd_returns', axis=1).loc[idx[:, :'2016'], :]\n",
    "test_data = data.drop('fwd_returns', axis=1).loc[idx[:, '2017'],:]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "For each train and test dataset, we generate a list with three input arrays containing the return series, the stock ticker (converted to integer values), and the month (as an integer), as shown here:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T00:40:15.516894Z",
     "start_time": "2020-06-22T00:40:15.418584Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "([(1035424, 52, 1), (1035424,), (1035424, 12)], (1035424,))"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_train = [\n",
    "    train_data.loc[:, sequence].values.reshape(-1, window_size , 1),\n",
    "    train_data.ticker,\n",
    "    train_data.filter(like='month')\n",
    "]\n",
    "y_train = train_data.label\n",
    "[x.shape for x in X_train], y_train.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T00:40:15.549577Z",
     "start_time": "2020-06-22T00:40:15.518439Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "([(131917, 52, 1), (131917,), (131917, 12)], (131917,))"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# keep the last year for testing\n",
    "X_test = [\n",
    "    test_data.loc[:, list(range(1, window_size+1))].values.reshape(-1, window_size , 1),\n",
    "    test_data.ticker,\n",
    "    test_data.filter(like='month')\n",
    "]\n",
    "y_test = test_data.label\n",
    "[x.shape for x in X_test], y_test.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##  Define the Model Architecture"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The functional API of Keras makes it easy to design architectures with multiple inputs and outputs. This example illustrates a network with three inputs, as follows:\n",
    "\n",
    "- A two stacked LSTM layers with 25 and 10 units respectively\n",
    "- An embedding layer that learns a 10-dimensional real-valued representation of the equities\n",
    "- A one-hot encoded representation of the month\n",
    "\n",
    "This can be constructed using just a few lines - see e.g., \n",
    "- the [general Keras documentation](https://keras.io/getting-started/sequential-model-guide/), \n",
    "- the [LSTM documentation](https://keras.io/layers/recurrent/).\n",
    "\n",
    "Make sure you are initializing your optimizer given the [keras-recommended approach for RNNs](https://keras.io/optimizers/) \n",
    "\n",
    "We begin by defining the three inputs with their respective shapes, as described here:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T00:40:15.556498Z",
     "start_time": "2020-06-22T00:40:15.551052Z"
    }
   },
   "outputs": [],
   "source": [
    "K.clear_session()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T00:40:15.563338Z",
     "start_time": "2020-06-22T00:40:15.557726Z"
    }
   },
   "outputs": [],
   "source": [
    "n_features = 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T00:40:15.577847Z",
     "start_time": "2020-06-22T00:40:15.564510Z"
    }
   },
   "outputs": [],
   "source": [
    "returns = Input(shape=(window_size, n_features),\n",
    "                name='Returns')\n",
    "\n",
    "tickers = Input(shape=(1,),\n",
    "                name='Tickers')\n",
    "\n",
    "months = Input(shape=(12,),\n",
    "               name='Months')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### LSTM Layers"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To define stacked LSTM layers, we set the `return_sequences` keyword to `True`. This ensures that the first layer produces an output that conforms to the expected three-dimensional input format. Note that we also use dropout regularization and how the functional API passes the tensor outputs from one layer to the subsequent layer:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T00:40:15.585322Z",
     "start_time": "2020-06-22T00:40:15.583391Z"
    }
   },
   "outputs": [],
   "source": [
    "lstm1_units = 25\n",
    "lstm2_units = 10"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T00:40:16.585607Z",
     "start_time": "2020-06-22T00:40:15.587252Z"
    }
   },
   "outputs": [],
   "source": [
    "lstm1 = LSTM(units=lstm1_units, \n",
    "             input_shape=(window_size, \n",
    "                          n_features), \n",
    "             name='LSTM1', \n",
    "             dropout=.2,\n",
    "             return_sequences=True)(returns)\n",
    "\n",
    "lstm_model = LSTM(units=lstm2_units, \n",
    "             dropout=.2,\n",
    "             name='LSTM2')(lstm1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Embedding Layer"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The embedding layer requires the `input_dim` keyword, which defines how many embeddings the layer will learn, the `output_dim` keyword, which defines the size of the embedding, and the `input_length` keyword to set the number of elements passed to the layer (here only one ticker per sample). \n",
    "\n",
    "To combine the embedding layer with the LSTM layer and the months input, we need to reshape (or flatten) it, as follows:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T00:40:16.600589Z",
     "start_time": "2020-06-22T00:40:16.586685Z"
    }
   },
   "outputs": [],
   "source": [
    "ticker_embedding = Embedding(input_dim=n_tickers, \n",
    "                             output_dim=5, \n",
    "                             input_length=1)(tickers)\n",
    "ticker_embedding = Reshape(target_shape=(5,))(ticker_embedding)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Concatenate Model components"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now we can concatenate the three tensors and add fully-connected layers to learn a mapping from these learned time series, ticker, and month indicators to the outcome, a positive or negative return in the following week, as shown here:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T00:40:16.650654Z",
     "start_time": "2020-06-22T00:40:16.601839Z"
    }
   },
   "outputs": [],
   "source": [
    "merged = concatenate([lstm_model, \n",
    "                      ticker_embedding, \n",
    "                      months], name='Merged')\n",
    "\n",
    "bn = BatchNormalization()(merged)\n",
    "hidden_dense = Dense(10, name='FC1')(bn)\n",
    "\n",
    "output = Dense(1, name='Output', activation='sigmoid')(hidden_dense)\n",
    "\n",
    "rnn = Model(inputs=[returns, tickers, months], outputs=output)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The summary lays out this slightly more sophisticated architecture with 29,371 parameters, as follows:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T00:40:16.658294Z",
     "start_time": "2020-06-22T00:40:16.652110Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"model\"\n",
      "__________________________________________________________________________________________________\n",
      "Layer (type)                    Output Shape         Param #     Connected to                     \n",
      "==================================================================================================\n",
      "Returns (InputLayer)            [(None, 52, 1)]      0                                            \n",
      "__________________________________________________________________________________________________\n",
      "Tickers (InputLayer)            [(None, 1)]          0                                            \n",
      "__________________________________________________________________________________________________\n",
      "LSTM1 (LSTM)                    (None, 52, 25)       2700        Returns[0][0]                    \n",
      "__________________________________________________________________________________________________\n",
      "embedding (Embedding)           (None, 1, 5)         12445       Tickers[0][0]                    \n",
      "__________________________________________________________________________________________________\n",
      "LSTM2 (LSTM)                    (None, 10)           1440        LSTM1[0][0]                      \n",
      "__________________________________________________________________________________________________\n",
      "reshape (Reshape)               (None, 5)            0           embedding[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "Months (InputLayer)             [(None, 12)]         0                                            \n",
      "__________________________________________________________________________________________________\n",
      "Merged (Concatenate)            (None, 27)           0           LSTM2[0][0]                      \n",
      "                                                                 reshape[0][0]                    \n",
      "                                                                 Months[0][0]                     \n",
      "__________________________________________________________________________________________________\n",
      "batch_normalization (BatchNorma (None, 27)           108         Merged[0][0]                     \n",
      "__________________________________________________________________________________________________\n",
      "FC1 (Dense)                     (None, 10)           280         batch_normalization[0][0]        \n",
      "__________________________________________________________________________________________________\n",
      "Output (Dense)                  (None, 1)            11          FC1[0][0]                        \n",
      "==================================================================================================\n",
      "Total params: 16,984\n",
      "Trainable params: 16,930\n",
      "Non-trainable params: 54\n",
      "__________________________________________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "rnn.summary()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Train the Model"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We compile the model to compute a custom auc metric as follows:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T00:40:16.669910Z",
     "start_time": "2020-06-22T00:40:16.660490Z"
    }
   },
   "outputs": [],
   "source": [
    "optimizer = tf.keras.optimizers.RMSprop(lr=0.001,\n",
    "                                        rho=0.9,\n",
    "                                        epsilon=1e-08,\n",
    "                                        decay=0.0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T00:40:16.700431Z",
     "start_time": "2020-06-22T00:40:16.671322Z"
    }
   },
   "outputs": [],
   "source": [
    "rnn.compile(loss='binary_crossentropy',\n",
    "            optimizer=optimizer,\n",
    "            metrics=['accuracy', \n",
    "                     tf.keras.metrics.AUC(name='AUC')])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T00:40:16.705569Z",
     "start_time": "2020-06-22T00:40:16.702025Z"
    }
   },
   "outputs": [],
   "source": [
    "lstm_path = (results_path / 'lstm.classification.h5').as_posix()\n",
    "\n",
    "checkpointer = ModelCheckpoint(filepath=lstm_path,\n",
    "                               verbose=1,\n",
    "                               monitor='val_AUC',\n",
    "                               mode='max',\n",
    "                               save_best_only=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T00:40:16.713989Z",
     "start_time": "2020-06-22T00:40:16.706996Z"
    }
   },
   "outputs": [],
   "source": [
    "early_stopping = EarlyStopping(monitor='val_AUC', \n",
    "                              patience=5,\n",
    "                              restore_best_weights=True,\n",
    "                              mode='max')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T01:43:51.374173Z",
     "start_time": "2020-06-22T00:40:16.715537Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/50\n",
      "32350/32357 [============================>.] - ETA: 0s - loss: 0.6893 - accuracy: 0.5368 - AUC: 0.5498\n",
      "Epoch 00001: val_AUC improved from -inf to 0.61844, saving model to results/lstm_embeddings/lstm.classification.h5\n",
      "32357/32357 [==============================] - 211s 7ms/step - loss: 0.6893 - accuracy: 0.5368 - AUC: 0.5499 - val_loss: 0.6765 - val_accuracy: 0.5771 - val_AUC: 0.6184\n",
      "Epoch 2/50\n",
      "32356/32357 [============================>.] - ETA: 0s - loss: 0.6857 - accuracy: 0.5491 - AUC: 0.5675\n",
      "Epoch 00002: val_AUC did not improve from 0.61844\n",
      "32357/32357 [==============================] - 399s 12ms/step - loss: 0.6857 - accuracy: 0.5491 - AUC: 0.5675 - val_loss: 0.6779 - val_accuracy: 0.5762 - val_AUC: 0.6167\n",
      "Epoch 3/50\n",
      "32356/32357 [============================>.] - ETA: 0s - loss: 0.6834 - accuracy: 0.5505 - AUC: 0.5708\n",
      "Epoch 00003: val_AUC did not improve from 0.61844\n",
      "32357/32357 [==============================] - 458s 14ms/step - loss: 0.6834 - accuracy: 0.5505 - AUC: 0.5708 - val_loss: 0.6895 - val_accuracy: 0.5479 - val_AUC: 0.5400\n",
      "Epoch 4/50\n",
      "32356/32357 [============================>.] - ETA: 0s - loss: 0.6814 - accuracy: 0.5473 - AUC: 0.5660\n",
      "Epoch 00004: val_AUC improved from 0.61844 to 0.67451, saving model to results/lstm_embeddings/lstm.classification.h5\n",
      "32357/32357 [==============================] - 332s 10ms/step - loss: 0.6814 - accuracy: 0.5473 - AUC: 0.5660 - val_loss: 0.5822 - val_accuracy: 0.6128 - val_AUC: 0.6745\n",
      "Epoch 5/50\n",
      "32352/32357 [============================>.] - ETA: 0s - loss: 0.6777 - accuracy: 0.5487 - AUC: 0.5688\n",
      "Epoch 00005: val_AUC improved from 0.67451 to 0.67761, saving model to results/lstm_embeddings/lstm.classification.h5\n",
      "32357/32357 [==============================] - 316s 10ms/step - loss: 0.6777 - accuracy: 0.5487 - AUC: 0.5688 - val_loss: 0.5727 - val_accuracy: 0.6160 - val_AUC: 0.6776\n",
      "Epoch 6/50\n",
      "32357/32357 [==============================] - ETA: 0s - loss: 0.6755 - accuracy: 0.5523 - AUC: 0.5742\n",
      "Epoch 00006: val_AUC improved from 0.67761 to 0.68097, saving model to results/lstm_embeddings/lstm.classification.h5\n",
      "32357/32357 [==============================] - 301s 9ms/step - loss: 0.6755 - accuracy: 0.5523 - AUC: 0.5742 - val_loss: 0.5699 - val_accuracy: 0.6166 - val_AUC: 0.6810\n",
      "Epoch 7/50\n",
      "32350/32357 [============================>.] - ETA: 0s - loss: 0.6740 - accuracy: 0.5544 - AUC: 0.5777\n",
      "Epoch 00007: val_AUC improved from 0.68097 to 0.68129, saving model to results/lstm_embeddings/lstm.classification.h5\n",
      "32357/32357 [==============================] - 286s 9ms/step - loss: 0.6740 - accuracy: 0.5544 - AUC: 0.5777 - val_loss: 0.5721 - val_accuracy: 0.6199 - val_AUC: 0.6813\n",
      "Epoch 8/50\n",
      "32351/32357 [============================>.] - ETA: 0s - loss: 0.6726 - accuracy: 0.5571 - AUC: 0.5824\n",
      "Epoch 00008: val_AUC improved from 0.68129 to 0.68414, saving model to results/lstm_embeddings/lstm.classification.h5\n",
      "32357/32357 [==============================] - 216s 7ms/step - loss: 0.6726 - accuracy: 0.5571 - AUC: 0.5824 - val_loss: 0.5696 - val_accuracy: 0.6177 - val_AUC: 0.6841\n",
      "Epoch 9/50\n",
      "32357/32357 [==============================] - ETA: 0s - loss: 0.6718 - accuracy: 0.5607 - AUC: 0.5872\n",
      "Epoch 00009: val_AUC improved from 0.68414 to 0.68560, saving model to results/lstm_embeddings/lstm.classification.h5\n",
      "32357/32357 [==============================] - 239s 7ms/step - loss: 0.6718 - accuracy: 0.5607 - AUC: 0.5872 - val_loss: 0.5735 - val_accuracy: 0.6219 - val_AUC: 0.6856\n",
      "Epoch 10/50\n",
      "32357/32357 [==============================] - ETA: 0s - loss: 0.6698 - accuracy: 0.5625 - AUC: 0.5910\n",
      "Epoch 00010: val_AUC did not improve from 0.68560\n",
      "32357/32357 [==============================] - 235s 7ms/step - loss: 0.6698 - accuracy: 0.5625 - AUC: 0.5910 - val_loss: 0.5831 - val_accuracy: 0.6199 - val_AUC: 0.6840\n",
      "Epoch 11/50\n",
      "32352/32357 [============================>.] - ETA: 0s - loss: 0.6728 - accuracy: 0.5618 - AUC: 0.5900\n",
      "Epoch 00011: val_AUC did not improve from 0.68560\n",
      "32357/32357 [==============================] - 226s 7ms/step - loss: 0.6728 - accuracy: 0.5618 - AUC: 0.5900 - val_loss: 0.5750 - val_accuracy: 0.6158 - val_AUC: 0.6770\n",
      "Epoch 12/50\n",
      "32355/32357 [============================>.] - ETA: 0s - loss: 0.6718 - accuracy: 0.5637 - AUC: 0.5932\n",
      "Epoch 00012: val_AUC did not improve from 0.68560\n",
      "32357/32357 [==============================] - 220s 7ms/step - loss: 0.6718 - accuracy: 0.5637 - AUC: 0.5932 - val_loss: 0.5729 - val_accuracy: 0.6207 - val_AUC: 0.6826\n",
      "Epoch 13/50\n",
      "32348/32357 [============================>.] - ETA: 0s - loss: 0.6716 - accuracy: 0.5647 - AUC: 0.5949\n",
      "Epoch 00013: val_AUC did not improve from 0.68560\n",
      "32357/32357 [==============================] - 185s 6ms/step - loss: 0.6716 - accuracy: 0.5647 - AUC: 0.5949 - val_loss: 0.5725 - val_accuracy: 0.6191 - val_AUC: 0.6826\n",
      "Epoch 14/50\n",
      "32357/32357 [==============================] - ETA: 0s - loss: 0.6730 - accuracy: 0.5645 - AUC: 0.5943\n",
      "Epoch 00014: val_AUC did not improve from 0.68560\n",
      "32357/32357 [==============================] - 187s 6ms/step - loss: 0.6730 - accuracy: 0.5645 - AUC: 0.5943 - val_loss: 0.5928 - val_accuracy: 0.6109 - val_AUC: 0.6739\n"
     ]
    }
   ],
   "source": [
    "training = rnn.fit(X_train,\n",
    "                   y_train,\n",
    "                   epochs=50,\n",
    "                   batch_size=32,\n",
    "                   validation_data=(X_test, y_test),\n",
    "                   callbacks=[early_stopping, checkpointer],\n",
    "                   verbose=1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Training stops after 18 epochs, producing a test area under the curve (AUC) of 0.63 for the best model with 13 rounds of training (each of which takes around three minutes on a single GPU)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T01:43:51.379877Z",
     "start_time": "2020-06-22T01:43:51.375669Z"
    }
   },
   "outputs": [],
   "source": [
    "loss_history = pd.DataFrame(training.history)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T01:43:51.391347Z",
     "start_time": "2020-06-22T01:43:51.380804Z"
    }
   },
   "outputs": [],
   "source": [
    "def which_metric(m):\n",
    "    return m.split('_')[-1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T01:43:52.501314Z",
     "start_time": "2020-06-22T01:43:51.393570Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAABQgAAAEYCAYAAAAQ+RvmAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOzdeXyTVdr4/0+WJl3SLd2AtnSDFqTIIigoFcQFxX1BcddRRxxn5lFxFH3En8MA4sM831GcEXFnxnkQRRmHGUVF3AZxASlYLHspUJYuKZSmaZbm/v1x0rSVQmlpmzS93q9XXknuJTknTXPu+7qvc45O0zQNIYQQQgghhBBCCCFEr6QPdAGEEEIIIYQQQgghhBCBIwFCIYQQQgghhBBCCCF6MQkQCiGEEEIIIYQQQgjRi0mAUAghhBBCCCGEEEKIXkwChEIIIYQQQgghhBBC9GISIBRCCCGEEEIIIYQQoheTAKEQ3cjtdjNu3DjuvvvuFsvz8vKw2Wwtlq1cuZJbb73V/7ympobZs2dz+eWXc+WVV3LVVVfxzjvvdEu5hRBCCCGEECLYfPvtt1x22WWBLoYQIcEY6AII0Zt88sknDBo0iKKiInbu3ElOTs5J7ed0Ornlllu4/PLLWb58OUajkbKyMu644w4ApkyZ0oWlFkIIIYQQQgghRCiTAKEQ3WjJkiVMnjyZ/v37s3jxYmbNmnVS+33wwQdERkZyzz33+Jelpqby7LPP4na7u6q4Qgghejiv18vcuXPZuHEjdrsdTdOYPXs2gwYNYvbs2fzwww8YDAYuuOACHnzwQerq6lpd/thjjzFw4EDuuusuAGbMmOF/PnHiRE4//XS2bt3KQw89hNFoZNGiRbhcLmw2G1dddRUPPPAAAMuWLeP1119Hr9cTHx/PM888w1/+8hcSEhJ48MEHAXj//ff5+OOP+ctf/hKwz00IIUTPcvToUX7/+9+zZcsWdDodBQUF/jZpwYIFfPLJJ4SFhREfH8/TTz9NcnLycZcL0VtJgFCIbrJjxw42bNjAggULGDJkCLfeeisPPvgg8fHxbe5bVFTEyJEjj1k+ZMiQriiqEEKIELFx40bKy8tZunQper2el156iZdffpmMjAycTicffPABDQ0N/OIXv+C7775j9erVrS5vy8CBA3n22WfRNI3bbruNefPmkZmZyaFDhzjvvPO47bbbKC8v549//CPLly+nb9++vPHGGyxcuJCbb76Ze+65h9/85jcYjUbefvttpk2b1g2fjhBCiFAxe/Zs4uLiWLFiBW63m/vuu4/XXnuNyy+/nMWLF7N27VpMJhOvvfYamzZtYsiQIa0uv+CCCwJdFSECRgKEQnSTJUuWcN555xEfH098fDxpaWm8/fbb3Hvvveh0umO293q96PVqmFCdToemad1dZCGEED3ciBEjiI2N5a233mLv3r18++23REVF8fXXX/PYY49hMBgwGAy8+eabgDrBam358uXLT/g+o0aNAlR79eKLL/L555/zr3/9i507d6JpGg6Hg7Vr1zJu3Dj69u0L4B8mAyAtLY3PP/+crKwsysvLGTduXBd8GkIIIULVl19+yZIlS9DpdJhMJqZOncrixYu5++67GTRoEFdffTXnnnsu5557LmPHjsXr9ba6XIjeTCYpEaIb1NXV8f7777N+/XomTpzIxIkTqaio4M0338TtdhMfH8/hw4db7FNVVUVcXBwAw4cPp7Cw8JjX/fTTT3nmmWe6pQ5CCCF6ns8//5x7770XgPPPP58bb7wRAKPR2OLi1IEDB6iurj7u8p9fqPr58BaRkZGAau+uvvpqNm/ezGmnncYjjzyC0WhE0zQMBkOL166vr2fnzp0A3Hzzzbz77rssW7aM66+/vtULZ0IIIcTxeL3eFm2H1+vF4/Gg1+t58803efrpp4mLi2Pu3Ln8z//8z3GXC9GbSYBQiG6wYsUK4uLi+Oqrr1i9ejWrV69m1apV1NXVsXLlSs4991z+9re/4fV6AThy5AjLly9n/PjxAFx00UXU1tby8ssv09DQAMDevXuZN2/eSU90IoQQovdZs2YN5513HjfddBP5+fmsWrWKhoYGxo4dy/Lly/F6vbhcLn7729/y/fffH3d5fHw8RUVFABw6dOi43Y5LS0upra3lgQceYOLEiXz77be4XC68Xi9nnXUWa9eupby8HIC33nqL+fPnAzBp0iSKi4v56KOPuPbaa7vnwxFCCBEyxo0bx5tvvommabhcLt5++23OPvtstmzZwmWXXUZOTg733nsvd9xxBz/++ONxlwvRm0kXYyG6wZIlS7jzzjsxGAz+ZTExMdx666288cYbvP7668ybN4/LLrvMv82VV17J1VdfDYDJZOL1119n/vz5XH755f6uX/fddx/XXHNNQOokhBAi+E2dOpXp06dz+eWX4/F4OOecc/j444955ZVXmDNnDldeeSUNDQ1MnjyZiy66iHHjxrW6fOjQoTz88MNMmjSJtLQ0xowZ0+r75eXlMWHCBC655BJMJhO5ubkMGDCA0tJSCgoK+N3vfsfdd98NQFJSEnPnzgVUOzdp0iQqKyuxWq3d9vkIIYQIDU888QSzZ8/m8ssvx+12U1BQwLRp0zCZTFxyySVce+21REZGEh4ezhNPPMGgQYNaXS5Eb6bTZGAzIYQQQggRQHV1ddxyyy08+eSTDB8+PNDFEUIIIYTodaSLsRBCCCGECJivvvqKCRMmUFBQIMFBIYQQQogAkQxCIYQQQgghhBBCCCF6MckgFEIIIYQQQgghhBCiF5MAoRBCCCGEEEIIIYQQvVjQBAi3b9/eKa+ze/fuTnmdYBOq9QKpW08UqvUCqZtom7RXbQvVuoVqvUDq1hOFar0gtOvW3TqjzQrlv4fUrecJ1XqB1K0nCrV6BU2A0OPxdMrrOByOTnmdYBOq9QKpW08UqvUCqZtom7RXbQvVuoVqvUDq1hOFar0gtOvW3TqjzQrlv4fUrecJ1XqB1K0nCrV6BU2AUAghhBBCCCGEEEII0f0kQCiEEEIIIYQQQgghRC8mAUIhhBBCCCGEEEIIIXoxY6ALcCJut5t9+/ZRX1/frn2Ki4u7sFSB0Z56hYeHk5aWRlhYWBeXSgghBEh79XPSZgkhhBBCiM7QkePs7hLsx/PtPc4O6gDhvn37iI6OJjMzE51Od1L7OBwOIiIiurhk3e9k66VpGlVVVezbt4+srKxuKJkQQghpr1qSNksIIYQQQnSGjhxnd5dgPp7vyHF2UHcxrq+vJyEhIei+BMFMp9ORkJAQlNF1IYQIVdJedYy0WUIIIYQQ4kTkOLtjOnKcHdQBQkC+BB0gn5kQQnQ/+e3tGPnchBBCCCHEicjxYse093ML+gChEEIIIYQQQgghhBCi6wT1GISBNm/ePDZv3kxFRQX19fWkp6cTHx/PggULTrjfSy+9xJgxYzj99NNbXT9nzhzuvPNO+vXr1xXFFuLUeb1QfxjqbFBXBXWVvnt163OoDA4MgKgkiEoES7LvcRKEx4Ferj0I0Z2kvRKiFQc2QtF7JNQ4QH8epORDbBpIFoIQJ83r1Sg97CLT1UCEyRDo4nSu4hVYyvbD4MGBLokQIoj1puNsCRCewIwZMwB477332LVrFw8//PBJ7ffLX/7yhOv/+7//+5TLJsRJ0zRw14G9Mchnaxbsax748y23V4LDBpq39dczhhOtN8HO5YB27HqdQQUNGwOG/luzZZZmy8OCc1BXIXoSaa+E8HFUw4/L4Ie/wsFNoDeS7PXAj4vUenMspAyBPvnqPiUfkgeDKSqw5RYiSG3Ye5hp7+/DuKKM/NRYRmfGMyrTyqiMeBIs5kAXr2PcDvjwUfhhMX0ikuGCewNdIiFEEOtNx9k9JkD47vp9vL1ub5vbeb1e9CeZvXT9qHSuPSOtXeWYMWMGhw8f5vDhwyxcuJA//vGPHDx4kOrqas4991weeOABZsyYweTJk6msrOSLL76gvr6ePXv2cM8993DNNddw66238tRTT/HBBx+wb98+qqqq2L9/P4899hgFBQV89tlnLFiwAIvFQmxsLHl5edx9993tKqfoJexVULUdKrdDzf4WWX4q+OcL+nmOMzCpzgCRVohMgMhESMyF/mPV86hE3/LG9b5tTJFsLy5mcF6uen17xXFuleq+ukQ9dtW2XgaTpVnwMPlnwcVEsKRA2igJJIoeo7e3V7/5zW/aVU4hTpnXC7u/hB/+BsUroMEJfYbCJfNh6HVs3bGLvDgPHCqCQ5vVrfD/mrVLOrBmNwUMGwOIsf0lI170eiP7xzH7gj6UeaJYt9vG4q9LefmrEgCyk6IYnWFlVGY8ozOtZCREBv84YVU74Z3b4eCPkJhHWOVWFTCU40wheoSTPc5uj1M5zq6qquKll14KmePsHhMgDCZjxozhjjvuYN++fQwfPpwpU6bgdDr9X4TmamtrefXVV9m9ezfTpk3jmmuuabHeZDLxyiuvsGbNGl577TXOPvtsZs+ezdKlS0lMTGT69OndWTURjBrcYCtpCgRWbm967LC13NYcC1G+YF5MKvQ53RfgS2wW5GsM/lnV9h09+dEbVCagJenktnfZfUHDylYCieXq8eFSKFunlmkNzeoVA/nXwPCbIW20dA8TrfJ6vTz11FNs3boVk8nE7NmzycjI8K/ftGkT8+bNQ9M0kpKSmD9/Pnq9nscff5yysjJcLhf33Xcf559/fgBr0bmkvRIh7cg+Fejb8KZqP8JjYeRtMPJW6DvMv5k37BD0Hwz9xzTt6/WqfRoDhod+VAHE4hX4s+NN0ZByWrPAYb56bo7u3noGWs1+2LhEXVRMyFHBVGu2BFR6CZ1OxxmpkdwyeBAA9e4GisqOsK60mnW7bazcfJClvpP1RIuZURnx/oDhaf1iCDMEUZD9p/fhH/erY9ib3gbnUXj3LqjerTKJhRCiHcaMGcMNN9xAVVVVyBxn95gA4bVnpJ1UVNfhcBAR0bUHLFlZWQDExcXx448/8s0332CxWHC5XMdsO2iQakz79u3b6vrBvjEv+vTpg8vlwmazYbFYSExMBGDUqFFUVlZ2VVVEsNA0lennD/5tg8od6rGtpGWwLCpZZfqddgUkDIRE3y0mDYymwNWhLaYodYvPaHvbxjEQa8vh8B7Y/B5sehvWv6HqPPwmGHYjxPTt8mJ3GVcdlBc3deX2Bz11Le6anv98va6NdT97rjOAt9n3KAStWrUKl8vF0qVLKSwsZN68eSxcuBAATdOYOXMmCxYsICMjg3feeYeysjI2bNhAXFwc8+fPp7q6mquvvvqUA4TSXgnRhTxO2PqByhbcuRrQIGs8TJwJgy87+aCVXg/WLHUbfFnTcmctVGxR2UWNwcMf34V1rzVtE5/ZlGnYGDyMzwq9bMP9hfDNC1D0Lng9x66PSW0KFibkgDVH3cdnSvAwhIWHGVQX40wrjM/B69XYWVHL97tVwPD7UhU0BIgIMzCifxyjMq2MzoxnRP94LOYAnH56XPDJk/DtQkgdBVNeh7j+UPaDWl+1UwKEQvQQJ3uc3R1C8Ti7xwQIg0lj6vx7771HdHQ0s2bNorS0lLfffhtN01rdtq3XapSQkIDdbsdms2G1Wtm4cSOpqamdWwEROB6X6nLbPAuw8bGjumk7gwkSBkDyaXDalSogmDBQHXhHxAWu/N1Fr/dlPloheRDkXgST58Pmf6hskU9/D6v/ADnnq2Bh3mQICw90qdt29BBsWwlbP4Rdn4PH0a1vn2NJg/rfqeCqsYeOG3QC69evp6CgAIDhw4dTVFTkX1dSUkJcXByLFy9m27ZtjB8/nuzsbFJSUpg0aZJ/O4MhtAZgl/ZKnJDXC/s3wLYPSTmwB1wTod8I1d4EW7Dr0GaVKbjxLZU9H5MK5/4ORtysAlKdxWxRw1qkjWpapmlwZK8vYOjrpnywSAUqGy/yhEWqNrv/GPUb2ye/88rUnbxe2P4RrP0L7P4KwqJg9N1w1r2qB4JtlwqmNL/f8i91kdNPp/4+Cb7gYWPg0NoYPOwB7bU4aXq9joEp0QxMieams/oDcKimnnW7q/l+t411pTb+vHo7Xg30OjitXwyjMqyMzlRdk1Niuvj7cHgvvHOH6qFy1n1w4aymC+pWdXKPbVfXlkEIEZJC8ThbAoSnYOzYsTz00EOsX7+eiIgIMjIyKC8vP6XX1Ov1zJw5k3vuuYfo6Gi8Xm+LLnIiADRNdfP1esDrVllYXk+zZZ7Wn3vqidv5Dez9e1MgsHp3y2xASx+V/XfaVb5MwFwVGIzrr7o/iCbmaNVtbOSt6qRk4xIoXALL7lQzJw+9TgUL+40Mni7ImqZOJLd9qIKCZevV8rj+qhtc1rlgDMffnc3fkJzoeXu2bfa8voaG/7wAK/4LPnsaxtwHo34B4TGdVNnAq62txWKx+J8bDAY8Hg9Go5Hq6mo2bNjAzJkzycjIYNq0aeTn5zN27Fj/vr/97W+P6Q7QGqfTSXFxcYtlbrcbh6N9AV9N09q9T1tcLhcejweHw4HH48HlcuFwOBgxYgQzZszgu+++IyIigv79+1NaWurfpvl+TqcTr9eLw+GgoaEBp9OJ2+3219HpdPqXP/roo9x1113+9qpfv344HI52183tdh/zmQaj+vr6HlHOE9E1uIgsX0902ZdY9v+HMEcFmk5PrN4E25cC0GCMpD4+j3rrYBzWwdRbB+OOSu3231a9q5aYPZ8QV7KCCNtPaHojR1PHczjrMuwpZ6p28qADDp74b9J5f7dMSMqEpMsgH3Seesw1JZgP7yD88HbMh7cT+e2L6Nb+GUd8HkcyL6Um4yIazF1zYa8zv486j4PY3R9g3foW5tq9uCOSsQ37NYezr8RrioZDTmA/EA7GIZA8BJKb9te7jmI6uhdT7T5MtXvV4yN7CSvbiNF1xL+dhg5PZAqu6DRclnRcljRc0em4otNxR6WiGUydXrfuMlhmwvVLiQnn0tP7cunpqqdHrdPDhj3V/izDpd/v5Y2vdwOQbo3wjWOosgxzkizo9Z30W7PtI1h+LzR4YMpiGHJVy/UR8XhMsRhtOzvn/YQQvVIoxYV02s9Dmz/T0TGdZsyYQVlZGXq9nj/84Q/k5OScsCDFxcXHNKytLWtLd3TZ6mqLFi3izjvvxGQy8fDDDzNu3DgmTZrUrnp15LMLlC4rq6ZB7SF1lf+Q71a9+ziBvQZf8M+jDiL8693Hn833ZBnMKuiXOMDXJTjX93iAGi+pBwqa75e3AUq+hMK/q3GjPPWQNFgFCk+/AaJT2v2Sp1w3jwtK/wNbfZmCR/ao5amjIO9ile2YfFpAgpjFP/3E4PBy+M+fVAajORZG36WChZbkNvcPdk8//TTDhg1j8uTJAJx77rl8+eWXAOzcuZMHHniAFStWAPDGG2/gdru55557OHDgAPfffz833XQT1113XZvvI+1Vk9baq6uuuqrddQua35Q29JRyHsNRDds/gS3/hh2fguuoygwbMBHyLoXcSRSX7GdwkkFlFJb9oO4P/qgm/AB1IabfiKZb6kiVJdbZv2WaBqVrVBfin95XmdbJp8GIW9XvelRCu1+yW/9u9iooWqbapQMbQR+mfvuH3wwDLgBDWKe9VafUq+YAfPeS6kJdf1j9bcf+WvVe6Kyy1tnUcCm2nU1Zh42P6w8321AHsemQkM0hyxBSrpwFBsllOFWd8T3p7P8hd4OXn/bX+Mcx/H53NZW16rcmLjKMvJRospOiyEqMIjvRQlZSFOnxkZiMJ5nZ3OCBz+bAf/4fpAyF6xerLNZW1D1/DpExVrh9RWdVL2j02DarDaFaL5C6dcW+Xa0rj+ePd5zdXu35/NpsdTsyptOuXbvweDy89dZbrFmzhmeffZbnn3++3RXpraKiorj++usJDw8nNTWVyZMn09AQ2mOHnTKPU40Z1NjtpzEg2LzLS0ya6u4SEa8O2PUGdfCrN7a8tbqs8XFY689bvFbja5vYUeliwBkTJBuwq+gNkHOeutUfgaL3VBfkT2bCqqdg4IXqpCz34q4dn7HOpk6+t37QdPJtjFDlGv87GDipQ8HKTqfTQfYEddu/Af7zrAoWrv0LjLgFzv5NU3ebHmjkyJF89tlnTJ48mcLCQnJzc/3r0tPTsdvtlJaWkpGRwbp167juuuuorKzkF7/4BU8++aQ/m1CcvNbaKxEkDu+BLR/A1n9D6dfqoldUsprwadClaty+5l099YfUGFzJvossoC6glf+kfi8aA4dfL2gajy4qyRcwHNkUNOzoxYaaA7DRN+GIbZeanGrYVJU1HkyZ4W2JSlDdcc+6Vx2PbFwCm5aqi1hRSSrIOfwmNXZhIB3YCGubjS84+DIYc7/qIt3Zn3XjkCFpZxy7rs7WrLuyL2hYuY2UXX+BIxvhulchuk/nlkcEXJhBz7D0OIalx3HXuCw0TaO0qo7vd9tYX1rNjvJaPt58iCp70zhdBr2O9PgIshKjyPIFDbMTo8hOiiIlOrwp6/DoQVh2l7pYO/J2uOSZE46J6bakgW1zV1dZCCHaLRDH2W0GCDsyppOmaTQ0NOD1eqmtrcVobPvqXzB32epu1157Lddee63/eUNDQ8h214J2diPRNIz1lc268+xQt6Ol6Hxdd70GM86YbJwpZ1MfNwBn3EDqY3PwmrshW08DGnw3N9Qb6yneuq3r37ebBW3Xn6gxcM4YTDW7id39AbG7PyRs20o8plhqMiZxOOtSnPF5J3yJk62b6egeLGVfYdn/HyIrN6LTvLjDE6lNm0htagH25FFoRt/J9z4bYDvh63WHlnULh6EzMGXehHXL34n94a/o1r9OTfr5VA26FWd87glfq7u052rhhRdeyJo1a5g6dSqapjF37lxWrFhBXV0dN9xwA3PmzGH69OlomsaIESOYMGECs2fPpqamhhdeeIEXXngBgJdffpnwcBkj62Tccsst3HLLLYEuhgCVeXdgo7pQseUDNSsvQGKeCv7nXQqpZ7RvbEFDmJoNuO8wOOMOtcxdry7G7f+hKWi4Y1VTtn1MastMw34jVHCoNQ1uNS7rhjdh+8fqNTLGwbmPqAw2U2SHP46g0Ccf+syBC55Sn1Hh3+HbRbD2z+ozHX4z5F/XoazIDvF61ee89s/Nxhe8SwUzrdndU4af8wcPR7VYvP+DP9Lvhz/Ci+Pg2lfUhS0RsnQ6HZmJUWQmRjFlVLp/+ZE6N7sqaymptFNSaWdXpZ2SCjvf7LLhcDclT0SEGchMjOLiyK3cXT4Hs9fBvnP/H3FjbiUu7MQXiF3R6VD6kfptk/ExhRBBJBDH2W1G7joyplNmZiZlZWVccsklVFdX8+KLL7ZZELPZ3GqXrfama4ZCl63WtLdeYWFhQZuG+3PHTXl110PlVl9G4GZ1snNoc8uswNh06DMEhl3tm1EwH31CDhF6A8HwLQjmdOhTEfz1GgxnXaK6IO/8DGPhm1i3/APr9rdVV5PhN8Hp10NU4jF7HrduDR7Y9506+d66Uk0sA+r1Ch6GvIsJ6zuCeL2e+C6uXUe1XrfBcOYklb3zzQvErnud2D2fqK5w4x6EjHN6TOaOXq9n1qxZLZY1H95i7NixLFu2rMX6J554gieeeKJbyidEp2tww+7/NAUFa/YBOpUFduEfVKbgcbrVdVhYuMoEa54N5qxV3ZH3b2gKHG75V9P6+MxmAcORarKtTUvVhCP2CjUe7zkPqEzmzi5vMDCEQd4l6mavgh/fUcHCDx+Bj/5bLR9+Mww4v1O7IPu56lR25jcLoWqHCuJeOEtlVwXpxGdHsi6l36hL4e3b4a9XwfhHYfwj0iOjl4mNDGNEfzX7cXOapnGoxsmuylp2VdgpqThK/s6XuaLsr+zS+vIr1wy2f9wHPv4Ea5TJl3XY2GU5iqykKDIToggPM+CypAGaGoYoeVBA6imEEMGizQChxWLBbrf7n3u9Xn9GYFxcHBkZGQwYMACAgoICioqK+Pzzzxk3bhzTp0/nwIED3H777axYsQKzOfRmzRSdQNNUcKKxW3BjQLByW9OEHsYI1e1p0KX+QCApp6nuwkIcj94AAy9Qtzqb6kpV+H/w0WOqG3Kub1yogRe2flJWXwM7P1UBwe0fqXG89GGQVaAyLnInqQlHQkFMX7joD1AwHda9qk4k37gU0karE/e8ycE3q6kQvVF9Dez4RAUEt38CziO+IQ0mwnmPqd+1Vi5+dCmzBTLGqpu/nEdgf2Gz7snrYfPypvV6oyrryNvUjPS9Zay5qAQYM03dDv6oJtvatBSK/6m6gJ9+vWqXUk479feqOQDfv6zGF3RUqwDtta927viCXSl5MNyzGv49Hb6YB3vWqmzCEBgzV5wanU5Hn9hw+sSGc3Yf4L0H4fCnMPR6Mif/L4tq9SrjsMKXdVhZy1fbK1i2fl+z14B+sRGcHRbOfGDll2vQ8mJJt0aSkRBJdHgP+B8RQohO1ubRWEfGdHK5XISFqR/V2NhYPB6PjKEnFHuVGiuwohjKt0DFFgbu3wTNZrgjNl0FAAddqrrnpOSrri9y1VicikgrnHmPuh36SWVTbFyqslyajQtltB+Cb79SMw+XfKUmqomwqnEE8y5RJ+EhNPPvMSLiVJBwzK9UMPXrBbD0ZjW5zjkPwNApXTueoxDiWEfKfNnLHzT9LkUmwODLVVuZPSH4uuOGx0L2eHVrZK+CAxtU4Cp3kgR6+gyFi4fChb9Xwd7Cv8O3L/q6IA9XgcKh1x2/i/bxHNgE37wAPy5T4wsOulRNPNIV4wt2NbMFrn4RMs+BD37n63L8qrpQJ8Seb+GdO1TvosuehTPuIEynIzsCspMsnP+zThO1Tg+7fd2VVQCxll171RiX6zas55V1TeNdWqNM9PcFC/tbI32Po8hIiCTJYu68mZaFECKItBkg7MiYTqNHj+bxxx/npptuwu128+CDDxIZGWQHrqJr1dmgvNgXDNzS9Nhe0bSNKRqSB3E0bTzxeQVqwO6UIUHb3UWEkJTT4KLZcP7/pyYVaTYu1MDGbRIGqtl98y6BtDN7T3ZLo7AINTbVyNvhp3+oCU3e/5WaFXDsr1XWj9nS9usIIU6OpoG7TnXXddWqdnTXZ2rm4QOFahtrjso8y7sU0s/seRfOorPx/MkAACAASURBVBLU8AWiJUMYDJqsbvZKFdgr/Dt8+Dv46PFmXZAvOH5b1Di+4Dd/gZIv1fiCo36hvi+BGl+ws+h0qs3pNxLeuR3+egWc9ziMmy6Z7b2VpqlA+qqnIDYN7voY+g1vczeL2Uh+aiz5qU3jkhcXh8M/43lkRBhXjRrHXlsdpbY6Sqvq2GOzs760mhUb9+PVml4nPExPenxj8DCqKYiYEElafARmYw/7bRZCCJ82z3g7MqZTVFQUzz33XCcVMXBuvvlmfv3rX7eY2XL27Nnk5eUxZcqUFttOnDiRDz/8kMWLFzNmzBhOP/10/zqn08kll1zC6tWrj/teS5cu5ZprrmHHjh18+umn/PrXv+78CnWFOluzAODWpsxAe3nTNqZoSMpT2QJJg9X4HkmD1Bg4Oh0Hi4uJD+rx7ETIMoRB3sXqZq+Cze9xaP8eUsbdDokDAl264GAwqgyW/GtVMHXNs6qL9hfPqG7WZ97bfQPsi+OS9ioANA089b6A3tGmwF7jffPHzqMnfu6yq/vGiT6aSxutLmYMulRl8va0DDDRPlGJP+uC/H8tuyAPuwGG3dTUBdlVp2ZK/uaFn40veFvoDcPSJx9++TmseABWz4bStXDNS93fpV4EluMw/ONXaob2QZfBVS+ojOVTYc3BdLjkmOBhI3eDl7JqB6W2OvZU2X3BQ3Vbs6OqxYQpjV2XG7MO+yeoQGKGNYqMxEhipOuyED3OiY6zL7vsshbb9vTj7F6WEtM+119/Pe+//77/i+Byufjss8946KGHjrvPL3/5yw6916JFi7jqqqsYPHhwcE7+4Kj2dQlu6hpMxRaoPdS0jcmiAoEDL/IFAX3BQF8gUIigFpUAZ96DrbiYFAkOHkunaxrPce/3KlD4xTOwZgGccTuMvT90xmPsgaS96kKuOtj1OWxbSdbO/8CHzqaAoHaSw6cYw1Ubabaoi2ZmC0Qmqsk7TFFNy1psE61mHY5O6craiWDWZyhc/DRc8Hs17mShb6KRr5+HfiNIicyBf37aM8cX7ChztBqHMPMc+HAGvFgA173WcvzLHsDr9fLUU0+xdetWTCYTs2fPJiMjw79+06ZNzJs3D03TSEpKYv78+ej1embMmEFZWRl6vZ4//OEPLZI2eoX9G9TENTVlMOlp1dOjM84xrNmw55vjrg4z6P2zLENSi3WaplFR61SZh1V1/uBhaZWdT7eUU1nrbLH9gGQLozOtjM6MZ3SmlbT4CHRyniREUOtNx9k9J0BYuAQ2vNnmZiZvw8l3uRlxCwy/8birL774Yp599ln/DMKffvopY8aM4aGHHsLpdHL48GHuv/9+LrigqbvMjBkzmDx5MmeccQYPP/wwNTU19O/fdNL83Xff8ec//xmA+vp6nnnmGdatW0dFRQUPPvggt99+O2+99RZ/+tOf+Oc//8nixYsxmUykpaX5u3d/8cUX1NfXs2fPHu655x6uueaak6vvyTqwSQ0m3jwzsPZg0/rGQOCAC9V98mCVERibJoFAIXqD9NEw9e/qt2HNc/D9K+qWfx2c81+dM7h+T9bL26vMzEwee+wxPvzww65vr7rKkTLYthK2fQQlX6hMQVM07oTTCU/JbBbIs6iARfPnLdb57kM5YCO6ntGkMkgHXerrgqxmQY7f8a5vfMH7of/Y3nMMptOp7tOpZ6jx5964FM6fCWf/V4/pcrxq1SpcLhdLly6lsLCQefPmsXDhQkAFnGbOnMmCBQvIyMjgnXfeoaysjF27duHxeHjrrbdYs2YNzz77LM8//3yAa9JNNE1NoLbyMTVu9J0fqmEWOos1W/1fuevVTO3toNPpSI4OJzk6nDMyjh0v1O70+AKGdewoP8q60mr+tXE/S77bA0Df2HBGZVo5MzOeUZlW8lKiZXxDIU7kJI+z2+UUjrPr6uo4evRotx5nz5o1q8viQj0nQBgAZrOZ888/n08++YQrrriC9957jzPPPJMrrriCs846ix9++IHnn3++xReh0fLly8nNzeXBBx9k48aNfPvttwBs376d+fPnk5KSwosvvsjKlSu57777WLhwIX/6058oLFTjDFVXV/P888+zfPlyLBYLs2bNYunSpURGRlJbW8urr77K7t27mTZtWueecB3eC4t8Az+HRfkCgeerAGDSIF9GYFqPOQATQnShpDzVtee8x2HtC7D+Ddj0FuReAhc8pX4vRLcIpvZq7ty5vPvuu8TGxnZte9WZvF41eca2j2Drh3Bwk1oelwFn3KFm2804h33bd/aOrEkRvKISVdbUmPvYWlTIoPy2x10LWX2HwS+/gH/+Ro1FV/o1XL2o/ZO6BMD69espKFDH28OHD6eoqMi/rqSkhLi4OBYvXsy2bdsYP3482dnZaJpGQ0MDXq+X2tpajMZechrnrIV/PaACeAMuVH/jzh7aJCEH0OBwqTq26URRZiOD+8YwuG8MoCZBafBqbD14lO932/h+t43vSqpYsXE/ADHhRkZlWhmVGc+ZmVaGpsXKmIZCBNiJjrNPP/10iouLu/U4uyvjQj2nZRl+4wmjuo1cvqhuZ5kyZQr/8z//w1lnnUVNTQ0TJkxg4cKFLFu2DJ1Oh8fjaXW/7du3+xv+YcOG+RvxlJQU5syZQ2RkJIcOHWLkyJGt7r93714GDBiAxaImATjjjDP47rvvGDZsGIMGqZPuvn374nK5Oq2uAFRuVfdT/0+d5EsgUAjRltg0uHgunPswfPeymoXzP3+CaxYFumSB0cvbq9GjR/PFF18wcuTIrm2vTpXL7u86zLaP1JAZOr2alOiCp1QbmJTXe7KyRI+jGcyBLkLghcfAlDdUFvtHj6sux1Ne79zssi5QW1vr/80EMBgMeDwejEYj1dXVbNiwgZkzZ5KRkcG0adPIz88nMzOTsrIyLrnkEqqrq3nxxRdP6r2cTifFxcWnVN76+vpTfo2OMB/eSerXj2Oq3UvF0GlUDb4N9pQD5W3ue7Lq6+spsevIAvZu/ILa1FbGgu0COuDMeDgzPgJteD8O1XooKq9n86F6Nh+oZvUWVccwvY68RDNDUsIZkhzOacnhRJlO7vwsUH+3rhaq9QKp2/G43W4cDod6kneVunW2xtc/jiuuuII//elPDBs2jMOHDzNmzBheeeUVli5dik6nw+l04nA48Hq9OBwOPB4PLpeLLVu2cPbZZ+NwOMjNzUWv1+NwOIiPj2fWrFlERERQXl7O8OHDW+zvdDppaGhgx44dZGdnYzAYcDgcDBs2jLVr15Kfn8+AAQNwOBzExcVRX1/f9Bn9jNvtPuazP94F754TIAyQvLw87HY7f/3rX7n22mt57rnnmDJlCuPHj+fdd99l+fLlre6XnZ1NYWEhF1xwAT/99JP/xOyJJ55g1apVWCwWHn30UTRNTYml0+nwepsapLS0NHbu3EldXR2RkZGsW7eOrKws/7Zdxlai7vuNlOCgEKJ9Iq0w4VEoeAh0crW7uwVLe/Xdd9/5u1AE3bhK/q7DK9VMr76uwww4X80UO+BCmXRHiJ5Gp4Mz72nqcvy6L4t97K+DNsBvsViw2+3+516v139xJi4ujoyMDAYMUOMhFxQUUFRUxOeff864ceOYPn06Bw4c4Pbbb2fFihWYzScOFJvN5lPOfC4uLu7+7OnCJfDpg2oYh9veJznrXJK74G2Ki4vJyjsfVkF6pAsClCV+GnBes+dVtU6+313NOl+W4bLNR1j642F0OhjUJ4YzM+MZnWVldKaVlJjWu0UH5O/WDUK1XiB1O9G+nXlRvSNOP/10HA4Hb7/9NlOmTGHRokVMmTKFM888kw8++IDly5cTERGBXq8nIiICo9GIyWRi4MCB/PTTT0yePJmffvoJr9dLREQEs2bNanGcbTQaiYiIwGAwYDabMZvNGAwGcnJyKCkpQdM0IiMjKSwsZMCAAZhMJsLCwvzv2fi+rQkLCzvpz14ChCfh2muvZf78+Xz22WdERkYyZ84cFi1aRN++famurm51n5tvvpnHHnuMG2+8kezsbMLC1PhDV155Jddffz0xMTEkJiZSXq6uDo0aNYpf/vKX3H///QBYrVZ+85vfcNttt6HX60lNTWXGjBn8+9//7trK2krAGAHRfbr2fYQQoUvGWwuYYGiv+vfvz/3333/CGdq6TWPX4a0rYduHalZYUJODnHEn5E6CjHPUGG9CiJ4tdSTc+yW8fz98/ITqcnzVC0E5m/PIkSP57LPPmDx5MoWFheTm5vrXpaenY7fbKS0tJSMjg3Xr1nHdddfhcrn8v8+xsbF4PB4aGk5yoqSexO2AD34HG/4GmQVq8p2unqwp0grhcWDb1bXv0w4JFjMX5/fh4nx1Tlbn8rBhz2G+K7GxrtTG2+v2sXhtKQD9rZFNE59kWclOjAq+C3RChIDWjrOtViupqandepz98MMPd1lcSKc1pgQEWGsR5Y5EmR2d3GUrWLS3Xh2O0C+5Eap3w6/Wtn/fDpIrJT1PqNYLpG6ibdJeta3b2qzWNHYd3vohbP+4qetw+lkqIHgKXYdD+X9I6tbzhGq94BTrpmlqtudPZkJ0P9UFOe2MTi3fqWqcxXjbtm1omsbcuXP56aefqKur44YbbmDt2rX87//+L5qmMWLECJ544gnsdjuPP/44FRUVuN1ubrvtNi6//PI236szvied9l3zNqiJduzlUFsO9gr1G938ceUOqNkHBQ/DhMfA0LX5LP66vXSe6rJ+2/td+n6dxd3g5af9Nb4xDG2sK63GZldDeSREmRiVGU+i0cnoQZlkJkaRlRBFbGRoXMCV376e6VQzCIP1c+kJx/Pt+fwkg1C0ZCtRM3kJIYQQPcWRfarb8FZf1+EGJ5hjIGeidB0WorfR6WDsr9Q4hO/cAa9Ngotmw1n3Bk2XY71ez6xZs1osy8nJ8T8eO3Ysy5Yta7E+KiqK5557rlvK1y7eBqir+lmgr1w99z8uV0HBuirQWhnjzxgBliSwpEC/4XDFczDg2MH+u1RCDuz9tnvf8xSEGfQMS49jWHocdxeoSWx2VthZt9vGd7ttrC+tZk9VHX/fWOjfJz4yzB8szEyMavY4kujw0AgeCiFOjQQIRROvF6pL1FhMQgghRLDb/A/46o8tuw6P+gXkXQz9z5auw0L0ZmmjVJfjf/wKVj4KpWvgyj9DeGygS9azeBuI3rsabJ80Zf41z/g7btAvHCzJEJUM8RmQPlo9tiQ3LW98bLIEPnhrzYaid8HjBGPPmwBIp9MxINnCgGQLU89U4wBvLNpMZFJ/Sirt7K6yU1JZx+5KO2t3VfHehrIW+ydaTGT6AodZiVG+x5FkJkQRZZaQgRC9RdD/t2uaJmMotFOHe43XHlQDtluzOrdAQgjRC0h71TGnNNLJV/8LdTa44PcqUzAxN/AnmUKI4BFphRuXwNfPw6qn4OAmmLJYZamJk1P2A2lfP64eG8N9gb0kiOuvJoaxJKvMv6iklo/N0T3r99iaowKd1aWQlNv29j2AyaBnYEo0A1Oij1nncDVQarOzu7IpcFhSZefLbRUsW7+vxbbJ0eYWmYdZiZEqAzEhivAwmZROdA85zu6Y9h5nB3WAMDw8nKqqKhISEuTLcJI0TaOqqorw8NZnszqhxhmM4yVAKIQQ7SHtVcecUpvlbYDKbTD6bhj3QOcXTggRGnQ6OOe3ahzSZXfCqxfCpLnqt0N+r9uWPpptV/yb3NOGqqEbQvUzaxxiybYrZAKEJxJhMjCoTwyD+sQcs87u9LC7ys7uyjpf5qEKJH665RCVta4W2/aNDSczIYr+1khSYsNJiTHTJyacFN8tIcqEXh+i3xnRbeQ4u2M6cpwd1AHCtLQ09u3bR0VFxUnv43a7/TPDhJL21Cs8PJy0tLT2v0m1L0AoGYRCCNEu0l611D1t1m6V9Z40qP37CiF6n/5nwb1fwfJ74YOH1SzHlz+nJqYQJ9QQkRD6XbP9AcKdgS1HEIgyGxnSL5Yh/Y79m9fUuymtrKOkSgUNGzMPV28tp7LWyc+TlYx6HcnRZpJjwn2BQ7MKJEaH08cXUEyJCcdiNkrgRxxXR46zu0uwH8+39zg7qAOEYWFhZGW1L1gVzDPcnIpuqZdtF+gMEJvete8jhBAhRtqrlrqlbhVb1b0ECIUQJysqAW56G9Y8C6tnw4GNcP1i6DM00CUTgRZpVUFQ265AlySoxYSHMTQtlqFpxwYPPQ1eKmqdHKpxcvBIPeVH6zl4pJ5DNU4O1dSzs6KWNTsrOVrvOWbfSJOBPjHhJP8sAzElJpw+sWaSo9Vjk1HfHdUUQaYjx9ndJdSO54M6QCi6ma1EjSdiCN4IuBBCCAFARbG6T8oLbDmEED2LXg8FD/m6HP8CXr0Ipm+VTMLeTqdTWYRVkkHYUUaDnr6xEfSNjYAT5JvUuTz+oGHj7eARJ4eO1nPoSD3r91RzqMaJy3Ps5DfWKBNxJkj9uoYki5nEaDOJFhNJ0WYSLU03a5QJg3RtFqLdJEAomlSXSPdiIYQQPUP5FohJk5N6IUTHZJ4D0/4DJV+oCTWEsObAvu8DXYqQF2kykpVoJCsx6rjbaJrG4To3B5sFEQ/VODlYU8/Oskpq6j3sqrBTWevE2UogUa9TwcREi7lZ8NDkDyD6l0WbSIgySzBRBD2vV+Oo00NsRNcmc0mAUDSxlUD+yECXQgghhGhbxRZIlu7FQohTYEmCodcFuhQiWFizYfN74HGB0RTo0vRqOp2O+CgT8VEmBvdteSGweZdOTVNBk8qjTiprXVTWOqmsdVJxtPFeLSupVMHEevexwUSdDqyRzYOJvkCiL4gYGxFGlNmAxWz036LMRiJNBhk38Tg0TWNftYPN+49QVFbDTwdqqDl6lH6F9cRGhBETYSQ2Isx/i4kIIybc9zwyDIvJ2Gsmt6l3N1Be46Sitp6Ko+q7W+67b/64staJx6vx+yuGcPvZmV1WHgkQCqXOBvWHJYNQCCFE8GucwTjr3ECXRAghRKhIyAHNC4dLIXFgoEsjToJOpyMmXAWXspNOvK2madQ6PU2BxMYgYq3LH4CprHVSusdO5VEXDndDG+8NFpMKFjYGEKN+FkSMMhuJDjcSZTI0rQtv2s5/bzJgNPTM8RW9Xo3dVXaK9tewuewIRb6g4BGHGwCDXseAJAtej5eKfYepcbg54nDj1Y7/mnodLYOGzQOJPwsuxv5su5iIsIBnhHq9GrY6ly/w1xjoawoANr8ddR47JqdeBwkWM8nRKmg9qE80SdHq+RXD+nVp2SVAKBT/DMbZgS2HEEII0RaZwVgIIURn889kvEsChCFIp9MRHR5GdHjYCbs3N7I7PSqAU++h1unB7lT3jY/tTg9H/Y8b/Mv32OuabdOAq+HYrMXWhIfpiTbpyEo6TJo1gvT4SNKtkaTHR5BujSQlJjzggS9Pg5ddlXaKylQQsKjsCD8dqKHWF+QyGfTk9Ylm8tC+5KfGkN8vlrw+0YSHGY7J/Kx1ejjiCxbWODy+e3fTsvqmx0ccbvYfcVDj8FDjcLf5mYaH6QnT6zEYdBj1Oox6PQa9DqNBp+59y070XG2vb3qs12HQ6wkztHxeVVWFbvPGFtl+VXYXDa1EQC1mI0m+oN/gfjGcazGTHGMmyZe9qoKA4QEdQ1MChEKx+QKE8ZJBKIQQIshVbFH3yaEza5wQQogAawwQykQlAvwZgKfK6WnA7mzwBxhbBhY91DZbt7OsnKMNsHZnFctrytCaxZjCDDpS41SwMC0+kvSfBRGtUaZO7fLs8njZduiov5tw0f4jFB+o8XfTDg/Tc1rfGK4ZmUp+v1iGpMYwMDn6pGaabh6sTYtvX7k0TaPe7W0ZSKxrGUysc3lo8ILH68Xj1Who0NS914v7Z889Xg1Pg0aDV8PpaaDBq/mXebxe//MGr4a7oWmfxuVer5cES71/pu38frEq0Ncs8JccHU5itIlIU/CH34K/hKJ7NGYQxmcGtBhCCCFEmxoDhIm5gS2HEEKI0BGZAOZYlUEoRCcxGw2YjQasUW2Pa1lcjD/LzulpYP/hevZV17HX5mBvdR17bXXsrXbw8eaDVNldLfaNNBlIi28KGqb5Mg/TfcHE6PDjT25R725gy8GjFJUd8QcEtx486s/Us5iNDOkXw81nZfgzA7OTLAHJctPpdESYDESYDPSJDe/29/+55pmRoUAChEKxlYClD5giA10SIYQQ4sRkBmMhhBCdTadT47FLgFAEAbPRQFZi1HG7Q9udHvZVO3xBw5ZBxG9LbP5uv43iIsP8wcL0+Ejio0xsP1TL5v1H2F5e6+8SGxcZxtDUWH4xLssfDOxvjew1k4b0dm0GCL1eL0899RRbt27FZDIxe/ZsMjIy/Os3bdrEvHnz0DSNpKQk5s+fj9lsZtGiRaxevRq3282NN97IlClTurQi4hTZSmT8QSGEED1DRbHMYCyEEKLzJeRA2fpAl0KINkWZjeT1iSavT/Qx6zRN43Cd+5jA4d5qB1sOHmVVcTkuj5dEi5mhqTFceFoKQ/rFkp8aQ2pchMzO3Iu1GSBctWoVLpeLpUuXUlhYyLx581i4cCGgvngzZ85kwYIFZGRk8M4771BWVkZFRQUbNmxgyZIlOBwOXnvttS6viDhF1SWQMzHQpRBCCCFOzNsAldsha3ygSyKEECLUWLNh83LwuMDYdpdQIYKRTqcjPspEfJSJ09Pijlnv9WrUujzEnKDbseid2gwQrl+/noKCAgCGDx9OUVGRf11JSQlxcXEsXryYbdu2MX78eLKzs1m+fDm5ubncf//91NbW8sgjj3RdDcSpc9XB0QMyQYkQQojgJzMYCyGE6CrWbNC8cHgPJA4IdGmE6BJ6vU6Cg6JVbQYIa2trsVgs/ucGgwGPx4PRaKS6upoNGzYwc+ZMMjIymDZtGvn5+VRXV7N//35efPFF9u3bx3333cfKlStPmKrqdDopLi4+5QrV19d3yusEm66sl/nwTrKBMoeJmgB8dqH6N4PQrVuo1gukbsEmlAb9FZ1EZjAWQgjRVaw56t62SwKEQohep80AocViwW63+597vV6MRrVbXFwcGRkZDBigfjwLCgooKioiLi6O7OxsTCYT2dnZmM1mbDYbCQkJx30fs9ncKSeCoTaLTKMurdcWNRBv6tBxpKZ2/2cXqn8zCN26hWq9QOomRNAr9wW5k/ICWw4hhBChp3FMdpmoRAjRC+nb2mDkyJF8+eWXABQWFpKbm+tfl56ejt1up7S0FIB169YxcOBAzjjjDL766is0TePQoUM4HA7i4o7t+y6ChK1E3UsXYyGEEMGuYquawdh87KDcQgghxCmJSgRzDNh2BrokQgjR7drMILzwwgtZs2YNU6dORdM05s6dy4oVK6irq+OGG25gzpw5TJ8+HU3TGDFiBBMmTADg+++/57rrrkPTNJ588kkMBkNX10V0VHUJhMdCpDXQJRFCCCFOTGYwFkII0VV0OrBmSQahEKJXajNAqNfrmTVrVotlOTk5/sdjx45l2bJlx+wnE5P0ILZdkj0ohBAi+MkMxkIIIbqaNRv2Fwa6FEII0e3a7GIsegFbSdN4G0IIIUSwkhmMhRBCdDVrjprFuMEd6JIIIUS3kgBhb9fggSN7VSq9EEIIEcxkBmMhhBBdzZoNWoMKEgohRC8iAcLe7she8Hqki7EQQojgJzMYCyGE6GoJvuG0ZBxCIUQvIwHC3q6x4ZMMQiGEEMGuYivEpssMxkIIIbpO49BLEiAUQvQyEiDs7apL1L2MQSiEECLYVRRL9qAQQoiuFZUEJgtU7Qx0SYQQoltJgLC3s5WAMRwsfQJdEiGEEOL4GmcwlglKhBBCdCWdTiVPSAahEKKXkQBhb1e9G+IzQS9fBSGEEEGscQZjmaBECCFEV5MAoRCiFzIGugAiwGy7ZIISIYQQwa9xBmPJIBRC9HBer5ennnqKrVu3YjKZmD17NhkZGf71mzZtYt68eWiaRlJSEvPnz8dsNrNo0SJWr16N2+3mxhtvZMqUKQGsRYhLyIEt/4IGDxjklFkI0TvIr11vpmkqIyP7vECXRAghhDgxmcFYCBEiVq1ahcvlYunSpRQWFjJv3jwWLlwIgKZpzJw5kwULFpCRkcE777xDWVkZFRUVbNiwgSVLluBwOHjttdcCXIsQZ80GrweO7JGx2oUQvYYECHuz2kPgrpMZjIUQQgS/ii0yg7EQIiSsX7+egoICAIYPH05RUZF/XUlJCXFxcSxevJht27Yxfvx4srOzWb58Obm5udx///3U1tbyyCOPBKr4vUNjULBqlwQIhRC9hgQIezObbwZj6WIshAgBHemyFRYWdsJ9RBCp2CLZg0KIkFBbW4vFYvE/NxgMeDwejEYj1dXVbNiwgZkzZ5KRkcG0adPIz8+nurqa/fv38+KLL7Jv3z7uu+8+Vq5ciU6nO+F7OZ1OiouLT6m89fX1p/wawep4dTM4vOQCB4u/ptqT2v0F6wSh+ncL1XqB1K0n6qn1Gjy49TG9JUDYmzUOvCsZhEKIENCRLls7duw47j4iiDTOYJw1PtAlEUKIU2axWLDb7f7nXq8Xo1GdlsXFxZGRkcGAAQMAKCgooKioiLi4OLKzszGZTGRnZ2M2m7HZbCQkJJzwvcxm83FPBE9WcXHxKb9GsDpu3TQNVlroE2anTw+te6j+3UK1XiB164lCrV4SIOzNqktAZ1BdtoQQoofrSJetpUuXHnef4+mMbAzouVccT0Zn1y3s6B4GeOrZ74njSAA/M/mb9UyhWrdQrRf0zLq15wRx5MiRfPbZZ0yePJnCwkJyc3P969LT07Hb7ZSWlpKRkcG6deu47rrr0DSNv/71r9x5552Ul5fjcDiIi4vriqoIAJ1OJVHITMZCiF5EAoS9ma0EYtPAaAp0SYQQ4pR1pMvWifY5ns7IxoDQu+LYXKfXrXgnAP2GTaRfWuA+M/mb9UyhWrdQrReEdt0ALrzwQtasJIkBzAAAIABJREFUWcPUqVPRNI25c+eyYsUK6urquOGGG5gzZw7Tp09H0zRGjBjBhAkTAPj+++/9wcInn3wSg8EQ2IqEOms2HNoc6FIIIUS3kQBhb1ZdIt2LhRAhoyNdtk60jwgiFVvUfVLuibcTQogeQK/XM2vWrBbLcnJy/I/Hjh3LsmXLjtlPJibpZtZs2PJvaPCAQY4NhBChTx/oAogAsu2SCUqEECFj5MiRfPnllwAn7LIFsG7dOgYOHHjCfUQQkRmMhRBCdDdrDng9cGRvoEsihBDdQi6F9FaOw+CoVlfGhBAiBHSky5bX6z1mHxGEyrdA0qBAl0IIIURv0nieZNspva6EEL2CBAh7q+oSdS+NnRAiRHSky1Zr+4gg422Aym2QLTMYCyGE6EYJvmMIW0lgyyGEEN1Euhj3Vo0NnXQxFkIIEcyqd0ODE5JDd8ICIYQQQciSAmFRMpOxEKLXkABhb9XY0EkGoRBCiGBWXqzukyRAKIQQohvpdKqbcdXOQJdECCG6hQQIe6vqEnVVzBQV6JIIIYQQxyczGAshhAgUa5ZkEAoheg0JEPZWtt3SvVgIIUTwkxmMhRBCBIo12zfUhSfQJRFCiC7XZoDQ6/Xy5JNPcsMNN3DrrbdSWlraYv2mTZu46aabuPHGG/ntb3+L0+n0r6uqqmL8+PHs3Clp2UGnukS6FwshhAh+MoOxEEKIQEnIAa8bavYFuiRCCNHl2gwQrlq1CpfLxdKlS5k+fTrz5s3zr9M0jZkzZ/L000+zZMkSCgoKKCsrA8DtdvPkk08SHh7edaUXHeN2QE2ZuiImhBBCBKvGGYyTJUAohBAiABrPl6SbsRCiFzC2tcH69espKCgAYPjw4RQVFfnXlZSUEBcXx+LFi9m2bRvjx48nO1v9iD7zzDNMnTqVl1566aQK4nQ6KS4u7kgdWqivr++U1wk2nVkv05EScoAyh4maIPisQvVvBqFbt1CtF0jdgs3gwTIxRa/WOIOxZBAKIYQIBGuOuq/aCTkTA1sWIYToYm0GCGtra7FYLP7nBoMBj8eD0WikurqaDRs2MHPmTDIyMpg2bRr5+fkcOHAAq9VKQUHBSQcIzWZzp5wIFhcXh+QJZafWa+tuAFLzx5GaFvjPKlT/ZhC6dQvVeoHUTYigIjMYCyGECKToPmCMAFtJoEsihBBdrs0AocViwW63+597vV6MRrVbXFwcGRkZDBgwAICCggKKior4/PPP0el0rF27luLiYh599FEWLlxIUlJSF1VDtEtjAyeTlAghhAhmFY0BwrzAlkMIIUTvpNOpbsY2GVNfCBH62hyDcOTIkXz55ZcAFBYWkpub61+Xnp6O3W73T1yybt06Bg4cyN///nfefPNN/va3vzF48GCeeeYZCQ4GE9suMMdCpDXQJRFCCCGOr2IrxPYHs6XtbYUQQoiukJAtYxAKIXqFNjMIL7zwQtasWcPUqVPRNI25c+eyYsUK6urquOGGG5gzZw7Tp09H0zRGjBjBhAkTuqHY4pRUl4A1U10RE0IIIYJV+RbJHhRCCBFY1mzY9pGaOEtvCHRphBCiy7QZINTr9cyaNavFspycHP/jsWPHsmzZsuPu/7e//e0Uiie6hK0E+gwNdCmEEEKI/5+9e4+Purzzv//KTDIJyeQ0kyOQDExCSBAV0KoBKXigHvsrrvYGUbS63a3edm1ddtuuK6y1avHu4/fb1u5PrXa1tnaVym53y1ZtF8W2IlClIARCOCQECCGnCSQzOU7me//xTQZSgSRkJjOZvJ+PRx7fZA7f+VwZYJj3XNf1ObeBDsZFiyNdiYiITGSOIujrgVPHINMV6WpERMJmyCXGEmP6/HDyCDi0/6CIiEQxT01/B2M1KBERkQhyuM2jlhmLSIxTQDjRtB2DQO/pFzoREZFo1LTPPGaXRrYOERGZ2IIBoRqViEhsU0A40aiDsYiIjAfqYCwiItEgNR/iJ51+HyUiEqMUEE40rf0vbFpiLCIi0axxnzoYi4hI5Fks5nunFs0gFJHYpoBwovHUgDURUidHuhIREZFza6rS7EEREYkODrf2IBSRmKeAcKLxVEPmNPOTMBERkWg00ME4R/sPiohIFHC4zZVYgb5IVyIiEjZKiSaa1sNaXiwiItFNHYxFRCSaONzQ1wNtdZGuREQkbBQQTiSGYb7pUoMSERGJZgMdjDWDUEREooGzyDxqmbGIxDAFhBOJrwl6fZpBKCIi0W2gg3GW9iAUEZEo4HCbRzUqEZEYpoBwIhn4xGvgBU5ERCQaqYOxiIhEk9TJEJ+kGYQiEtMUEE4knhrzqCXGIiISzZr2aXmxiIhED4vFfA818H5KRCQGKSCcSFprIM4CGYWRrkREROTs+vzQfACytbxYRESiiMMNHi0xFpHYpYBwIvHUQNpUiLdFuhIREZGzaz2sDsYiIhJ9nG7z/VQgEOlKRETCQgHhRNJaowYlIiIS3QYalGiJsYjEqEAgwJo1a1i2bBkrV66ktrZ20PW7du1ixYoV3HnnnTz88MN0d3cHr2tpaWHRokUcOqSZbGPO4TY/wGqri3QlIiJhoYBwIvFUKyAUEZHo1rTPPKqDsYjEqI0bN9LT08O6detYtWoVa9euDV5nGAarV6/mu9/9Lq+//joLFy6krs4MpHp7e1mzZg1JSUmRKn1icxSZRzUqEZEYpYBwouhqg44WNSgREZHopg7GIhLjtm/fzsKFCwGYM2cOFRUVwetqamrIyMjg1Vdf5e677+bkyZO43W4AnnnmGZYvX05OTk5E6p7wHObzoIBQRGJVfKQLkDHS2t9xSzMIRUQkmqmDsYjEOK/Xi91++kMQq9WK3+8nPj6e1tZWduzYwerVq3G5XDzwwAPMnj2b+vp6HA4HCxcu5MUXXxz2Y3V3d1NZWTmqeru6ukZ9jmg1orEZAWZabLQe+IjGlKvCW1gIxOrzFqvjAo1tPBqv4yorO/te3woIJwrPQEDojmwdIiIi59Lnh+b9UHRtpCsREQkbu92Oz+cL/hwIBIiPN9+WZWRk4HK5KC4uBmDhwoVUVFTw/vvvExcXx5YtW6isrOSb3/wmzz//PNnZ2ed9rMTExHO+ERyuysrKUZ8jWo14bE43zrhTOMfB7yNWn7dYHRdobONRrI1LS4wnioGp8JnTIlqGiIjIObUehr4eyNYMQhGJXfPmzeP3v/89ADt37qSkpCR4XUFBAT6fL9i45OOPP2bGjBn8/Oc/57XXXuNnP/sZZWVlPPPMM0OGgxIGDje0qEGMiMQmzSCcKFprICUbElMjXYmIiMjZqYOxiEwAS5YsYfPmzSxfvhzDMHj66afZsGEDHR0dLFu2jKeeeopVq1ZhGAZz585l8eLFkS5ZBjjccOg9CATAork2IhJbFBBOFJ4aNSgREZHo1qgOxiIS+ywWC0888cSgy4qKioLfl5eXs379+nPe/2c/+1nYapMhONzg74L2ekifEulqRERCasiAMBAI8Pjjj1NVVYXNZuPJJ5/E5XIFr9+1axdr167FMAyys7P53ve+h8Vi4dFHH6Wuro6enh4efPBBrrvuurAORIbQehhcCyJdhYiIyLk1qYOxiIhEsWAn40MKCEUk5gwZEG7cuJGenh7WrVvHzp07Wbt2Lc8//zwAhmGwevVqnn32WVwuF2+++SZ1dXXs2LGDjIwMvve979Ha2sptt92mgDCS/N1w6pg6GIuISHRTB2MREYlmzv6Znp5qmP7ZyNYiIhJiQwaE27dvZ+HChQDMmTOHioqK4HU1NTVkZGTw6quvsn//fhYtWoTb7SY3N5cbbrgheDur1RqG0mXYWmsBQ0uMRUQkeqmDsYiIRLu0KWC1qVGJiMSkIQNCr9eL3X56qY/VasXv9xMfH09rays7duxg9erVuFwuHnjgAWbPnk15eXnwvg8//DBf//rXhyyku7ubysrKUQzF1NXVFZLzRJvRjMt+fDMFwOG2ODqj8HcTq88ZxO7YYnVcoLFFm7KyskiXIGNloINxjp5zERGJUharOenCUx3pSkREQm7IgNBut+Pz+YI/BwIB4uPNu2VkZOByuSguLgZg4cKFVFRUUF5eTn19PQ899BArVqzg85///JCFJCYmju6NYCAAO37Gibpa8oouAXsO2HNPd+6Ni7vwc0eBysrKC//9nPodANPmXQspWSGsKjRGNbYoF6tji9VxgcYmEjEDHYyz1aBERESimMOtgFBEYtKQAeG8efPYtGkTN998Mzt37qSkpCR4XUFBAT6fj9raWlwuFx9//DF33HEHzc3N3H///axZsyY4mzDs/F2w6SnyvA3wpz+7Ln5Sf2B4Rmhozz37Zbbksal3LHmqwZYKyc5IVyIiInJ26mAsIiLjgbMIqt83J6hYLJGuRkQkZIYMCJcsWcLmzZtZvnw5hmHw9NNPs2HDBjo6Oli2bBlPPfUUq1atwjAM5s6dy+LFi3nyySdpa2vjueee47nnngPgpZdeIikpKXwjsSXD31ay/5OtlEzOAG8DeBv7vxrA12QePdVwZCt0tADGWc5jHyJIzDn9c3xi+MYTSq014Jg27mdRiohIDGuqhAx1MBYRkSjnmA7+TvCegLTJka5GRCRkhgwILRYLTzzxxKDLioqKgt+Xl5ezfv36Qdc/9thjPPbYYyEqcQQsVvqSHJBbBrkXnf+2fX7oaP50kOhtBF//z01VUPN76Dp59nOUfxVueCr04wg1T432dBIRkejWVAXZ6mAsIiJRzuE2jy2HFBCKSEwZMiCMWdZ4SM0zv4bi7z49A9Hbf/zTq7Dnl/C5J6N7Zl6gD07WQuktka5ERETk7NTBWERExgtH/2QZTzVMXxjZWkREQmjiBoQjEZ8I6VPNrwF9PfDW38HJI5DpilxtQ2mrM2t1TI90JSIiYRUIBHj88cepqqrCZrPx5JNP4nKd/vf5lVdeYf369TgcDgC+/e1vU1BQwLe+9S3q6uqwWCx85zvfGTRLXsZIa406GIuIyPiQPhWsNvAcinQlIiIhpYDwQrnmm8faD6M7IPTUmMdMBYQiEts2btxIT08P69atY+fOnaxdu5bnn38+eP2ePXt45plnmD179qD7+P1+3njjDTZv3sz3v/99fvjDH0ai/Imtqb9BiZYYi4hItLNYIXOaOhmLSMxR26ULlV0GSRlQuznSlZxfa39AqBmEIhLjtm/fzsKF5lKfOXPmUFFRMej6PXv28OKLL3LnnXfyox/9CIDp06fT19dHIBDA6/USH6/PzSIi2MG4JLJ1iIiIDIfDfXoihohIjNA7oQtlsUBhuTmDMJp5aswp8GlTIl2JiEhYeb1e7PbTHXCtVit+vz8Y+t1yyy2sWLECu93OV7/6VTZt2kRpaSl1dXXcdNNNtLa28sILLwz5ON3d3VRWVo663q6urpCcJxqNdGyTD21jUko+h6qPhrGq0dNzNj7F6thidVwwPsdWVqYtEiYUh9tsZmkY0b0fvYjICCggHA3XfNj/NrQ3QGpupKs5O081ZLjMqfAiIjHMbrfj8/mCPwcCgWA4aBgG9957L6mpqQAsWrSIvXv3snXrVq6++mpWrVpFfX099957Lxs2bCAxMfGcj5OYmBiSN4KVlZUx+4ZyxGPbdBwmXxL1vw89Z+NTrI4tVscFsT02iREON/R2QPsJSMuPdDUiIiGhJcaj4VpgHo9E8SzC1hotLxaRCWHevHn8/ve/B2Dnzp2UlJxerur1ern11lvx+XwYhsG2bduYPXs2aWlpwdAwPT0dv99PX19fROqfsPr80HIAsmdGuhIREZHhcbjNoxqViEgM0QzC0ci/BBJSzGXGF90W6Wo+zTDAcxgK50e6EhGRsFuyZAmbN29m+fLlGIbB008/zYYNG+jo6GDZsmU88sgj3HPPPdhsNsrLy1m0aBGXX345jz76KCtWrKC3t5dHHnmE5OTkSA9lYlEHYxERGW+cRebRUw3Tro5sLSIiIaKAcDSsCVBwRfTuQ9jRAj3tpz/hEhGJYRaLhSeeeGLQZUVFRcHvly5dytKlSwddn5KSwg9+8IMxqU/OobF/nzF1MBYRkfEibSpYEtTJWERiipYYj5ZrPjTsgc7WSFfyaQMvWFpiLCIi0aqpyjyqg7GIiIwX1njIdEGLlhiLSOzQDMLRcs0HDDiyDWbeGOlqBvPUmMdMBYQiIlGlbjvOyvXQUQopWZDsPP2VlAGWCfT5XVMlZBRCon3o24qIiEQLR9Hp91siIjFAAeFoTbkMrDao3Rx9AWFrDRBnfrolIiLRY+9/kbPrOdh1luviLDApc3BomOzoP2ad/fLEVIiLG/NhhETjPsjW/oMiIjLOONxw+ANz3/fx+hosInIGBYSjlTDJDAmjcR9CTw2kT4X4xEhXIiIiZ1ryBPvybqO0IMvcL7ajBTo8Z3zffPoyTzUc+8j8OeA/+/ksCWcJE/u/UrLAWQzF143tGIdjoIPxjOsjXYmIiMjIOIug1wfeBkjNi3Q1IiKjpoAwFFzzYfMPoNsbXUukPNWQOS3SVYiIyFkY8UmQUWB+DesOBnS3DQ4Tfc1nhIpnXN6wxzx2tgKGef8HPoC8i8M2ngsy0MFYDUpERGS8Gdjn3VOtgFBEYoICwlAonA9/+N/mDI+iayJdzWmtNTDzpkhXISIioRAXB0np5tdwu9MH+uDUUfiXz8COn8NNa8Nb40ipg7GIiIxXA6/FLYf696UXERnfJtAu6GFUcIW5Z9SRLZGu5LTudvA1qUGJiMhEZrGaM8ln3gy71oG/J9IVDda0zzxmz4xsHSIiIiOVXgiWeHMGoYhIDFBAGApJaZB3SXTtQ9h62DwOd5aJiIjErrl3Q6cH9r8d6UoGa9pndjC2pUS6EhERkZGxxkOGCzyHIl2JiEhIKCAMFdcCc4mxvzvSlZgGPslyaAahiMiEV3QtpE6GHa9FupLB1MFYRETGM2eRZhCKSMxQQBgqrnLwd8HxHZGuxOSpMY9aYiwiIhYrzLkTDm6EtuORrsY00ME4R/sPiojIOOVwm++7DCPSlYiIjJoCwlApLDeP0bLMuLUGkp3m8mcREZE5d4ERgE9ej3QlpmAHY80gFBGRccrhhh4veBsjXYmIyKgpIAyVlCyzC2O0BISeGu0/KCIipzmLoHC+2c04GmY6BDsYq0GJiEwsgUCANWvWsGzZMlauXEltbe2g63ft2sWKFSu48847efjhh+nu7qa3t5e///u/Z8WKFdxxxx28++67EapeBnEUmUctMxaRGKCAMJRc8+HIVgj0RboSMyDU8mIRETnT3LvNzdSPbI10JepgLCIT1saNG+np6WHdunWsWrWKtWvXBq8zDIPVq1fz3e9+l9dff52FCxdSV1fHr371KzIyMvi3f/s3XnrpJb7zne9EcAQSNLDfuxqViEgMGDIgvJBPuIa6T8xyLYCedjixO7J1+Hug7ZgalIiIyGCzvgA2e3Q0K2msNLs/qoOxiEww27dvZ+HChQDMmTOHioqK4HU1NTVkZGTw6quvcvfdd3Py5Encbjc33ngjX/va14K3s1qtY163nEWGCyzxmkEoIjEhfqgbnPkJ186dO1m7di3PP/88cPoTrmeffRaXy8Wbb75JXV0dBw8ePOd9YtqZ+xBOnhO5Ok4eMfeZ0gxCERE5U6IdLloKFb+Em54xf46Upipzaw4RkQnG6/Vit5/+99dqteL3+4mPj6e1tZUdO3awevVqXC4XDzzwALNnz6a8vDx434cffpivf/3rw3qs7u5uKisrR1VvV1fXqM8RrUIxtqLkPLoO76Quyn5Hsfq8xeq4QGMbj8bruMrKzr4H+JAB4XA/4dq/fz+LFi3C7Xazbt26c97nXELx4gWRf4KKUibTtec31GVcE9LzjmRcKfUfUggcbrfQOQ7+sEb6OQunWB1brI4LNLZoc64XLxmFuSvNGYR7/9NcchwJAx2MZ1wfmccXEYkgu92Oz+cL/hwIBIiPN9+WZWRk4HK5KC4uBmDhwoVUVFRQXl5OfX09Dz30ECtWrODzn//8sB4rMTFx1K+llZWVMft6HJKxbS/F5m0kLcp+R7H6vMXquEBjG49ibVxDBoQX8gnX+e5zLqF48YIoeIL2LcZ24DeklZZCXFzITjuicbX9HoBpc68Be07IagiXiD9nYRSrY4vVcYHGJhNAwZXgLDZDwkgFhJ5qdTAWkQlr3rx5bNq0iZtvvpmdO3dSUlISvK6goACfz0dtbS0ul4uPP/6YO+64g+bmZu6//37WrFkTnE0oUcJRBEe2mQ3AQvj+T0RkrA25B+FwP+FKSEgIfsJ1vvvEPNd86GiB5v2Rq8FTAwkpkJIduRpERCQ6xcWZweCRLdB8MDI1qEGJiExgS5YswWazsXz5cr773e/yD//wD2zYsIF169Zhs9l46qmnWLVqFbfffjt5eXksXryYF154gba2Np577jlWrlzJypUr6erqivRQBMDhNveh9zVFuhIRkVEZMrW7kE+4CgsLz3mfmOeabx5rN0fujU9rjdmgRJ9giYjI2VyyHN59Anb+HK7/p7F/fAWEIjKBWSwWnnjiiUGXFRUVBb8vLy9n/fr1g65/7LHHeOyxx8akPhkhZ/9z56keF6u3RETOZciAcMmSJWzevJnly5djGAZPP/00GzZsoKOjg2XLlgU/4TIMg7lz57J48WICgcCn7jNhONxgzzUblVx+f2Rq8NRA9gQKZUVEZGTS8qF4CXzyOlzzj2Ad41n+6mAsIiKxwuE2jy2HoPCqyNYiIjIKQ74juJBPuM52nwkjLs6cRVj7YWT2oQgEoPUwlNwwto8rIiLjy9y74Rcr4dB7UPK5sX3spirI0f6DIiISAzIKIc5qziAUERnHhtyDUC6AawG01cHJI2P/2O3Hoa/bXGIsIiJyLiU3QrITdr42to870MFYy4tFRCQWWBPMkFABoYiMcxOkc8gYC+5D+CFkusb2sT015jFTAaHIRNLbF6DF20Ozt5tmb/envm/x9eDzeXF85CMxwYrNaiExwUJivAVbvIXEeCuJ8Zbg15mXBb9PsJxxP2v/5advb7NaiNPep+NHvA0uWQZ/fAl8LZDiHJvHVQdjERGJNQ43eA5FugoRkVFRQBgO2WWQlGE2Kplz59g+dmt/QDiwF4aIjFsdPX5avD00ebtpbu+mxddDc7sZ+jWf8X2Lr4eTHb1nPUdivIUseyJOu43OrgDevg66/QG6e/vo6QvQ3Ruguy9Ajz8QkpoHQsP7Fkznb5doL9SoN/du2Poc7P4FXPXg2DxmU6V5zCkdm8cTEREJN2cRHPsoMltMiYiEiALCcLBYoLAcjmwZ+8f2VIMlAdKnjv1ji8iwdPv7qG7yUdPso2kg8DvL7L+Onr6z3j81KZ5seyJZ9kRKclODAWBW/2VZA9+nJpJiswZn9VVWVlJWdvZZW4GAQU9f4HRo6O+jxx+g2x8IHj99Wd/g63v76O6//+WuzLD9/iSEci+CyXNhx2tw5QNj86amqco8ZilAFhGRGOFwQ3cb+JrBnh3pakRELogCwnBxzYf9b0N7A6Tmjt3jemrMPTAs1rF7TBE5q76AwRFPB1Un2tnf0E7ViXaqGtqpafbRFzCCt7PEgSPldMBXWJg8KPTLPuN7p91GYnzo/35bLHEkWawkJVghKeSnl2g25y546++g/hOYPCf8j6cOxiIiEmsc/U08PdUKCEVk3FJAGC6uBebxyIdw0W1j97itNWpQIjLGDMOgoa2bqoZ29p9oZ19/IHigsZ2uXnPpblwcFDqSKclN5caL8ijJS6U4205OWiKZyTasFi1HkQi5+A74zT+aswjHIiBs2qcOxiIiElsGtnfyVEPhlZGtRUTkAikgDJf8SyAhxWxUMlYBoWGA5zAU6EVJJFxOdfRS1dBO1Ym2/kDQS1VDO6c6T+8BmJOayMy8VO660sXMvFRm5qYyI9dOsk3/5EoUmpQJZZ839yH83JOQEMYppH1+aD4AMz4XvscQEREZaxmFEGdRoxIRGdf0bjVcrAlQ8BkzIBwrHR7oPqUOxjJuBQIGh1t87K47xe5jp9hdd4rK+jbi4uKwJ8aTkmglJTHe/N4W3/+9eVnw8nNdZosnOdFKgtUyrFo6e/o40Nh+enlwg5eqE200tHUHb5OaFM/M3FRuvSSfmXmplOSaYWBmii1cvyKR8Jh7F1Ssh6pfw+zbw/c4nmoI9EK2GpSIiEgMibeZIaGnOtKViIhcMAWE4eRaAJuehs5Wc4ZGuAU7GCsglOhnGAa1LR3sqjtFRd0pdh07yZ66Ntq7/YDZDXdWfhq3XjqZeEsc3m4/vm4/vu4+2rv8nDjVha/bb17e0zdoT7/zscVbToeNtjNDRfOyow0e6v/7BLWeDoz+UybGW5iRa2dBcRYzc1MpyUulNC+VvLSkYAMQkXFt+iJILzCXGYczIFQHYxERiVUON7RoBqGIjF8KCMPJNR8w4Mg2mHlj+B/PMxAQusP/WCIjYBhms44zZwburjtFe1d/GGi1UJafyhfmTubiKelcPCWDGbn2Yc/2MwyDbn8gGCJ6+4NEX89AqOjH2913xveDL2vt6OFoawe+bj8JBLjE5WTp3CmU9s8KdDlTtEegxDaLFeasgN/9f3DyKGQUhOdxGvcBcZA1MzznFxERiRRHERzbbm77pA+QRWQcUkAYTlMuA6sNajePTUDYWgPEmd0hRSLEMAyOtXayu+4Uu46dYnfdSSrq2oJ79NmsFkrzU/n8pZO5ZEo6s6ekU5Kbii1+eGHg2cTFxZGUYHbgzbInjqr+yspKysrUQEEmoDkr4HfPwCevw6JvhOcxmvaZS7BsyeE5v4iISKQ43OZ2Tx0eSHFGuhoRkRFTQBhOCZPMkHCs9iH0VEPa5PBuMC9yBsMwqDvZOWhW4O66U5zsMMPABGscM/NSufnifC6eks4lU0cfBopImGROg2kLYefPYeHfgSUMf0/VwVhEzqOrt49mbzdFHLNTAAAgAElEQVRHTvYwqdlHvDWOBKuFeEsc8VYLCdY44i3mUVt8SNQJdjI+pIBQRMYlBYThVlgOHz4LPT6wpYT3sTw1alAiYdXZ08cfD3t4+08ejm/5I7uPnaS1PwyMt5hh4I0X5XHx1HQunpLOzLxUEuOtEa5aRIZt7kr45V+bM9+nLwztuft61cFYZALydftp9nbT7O2mqb0n+H2zt5vm9h5afN00e3tobu8O7kNsOnbe81otccRb+gPEM4LDeGscCZY/v8xyjttamJyexKrPzdSHlzJ6ziLz6KmGgisiW4uIyAVQQBhurgXwwf+BYx+Be3F4H6u1Rm+8JKT8fQE+OXaKzQeb2XywmR1HTtLTF8ASBzPz0vjcrDxmT03nkv4wMClBYaDIuFb2eXgrzWxWEuqA0FOjDsYiMcAwDNq6+kO/9v5w74zQbyAEbPGZAWBnb99Zz5ORnECWPZEsu41Zk9PI7v8+y55Ia3MDuXn5+PsMegMB89gXwB8w8PcF6O0z8AcvN7/v7TOv8wf6b3vm5f3Hjh5///Wnb1vX2jHsRmci55XhgjiLGpWIyLilgDDcCq4wXyhqPwxvQNjjA2+DOhjLqBiGwYFGLx8caObDQ81srfbg7fYTFwez8tO4b8E05hdnkdbVyNxLLop0uSISarZkmP0X8Mk6uPl7kJQWunOrg7HIuNEXMDjc4mNffTv7TrSx70Q7DW1dwUCwpy/wqftY4sCRYusP/RKZ5kwmy56IcyD4S03sDwETcaTYzjtjr7LSR1nZ1HAOUST04m2QXmDOIBQRGYcUEIZbUhrkXRL+fQgHOhhribGMUN3JTjYfbObDg81sPtRCU3s3ANOcyfyvOZO5ujiLcreTzBRb8D6Vlc2RKldEwm3uStj+E9jzH3DZl0J3XnUwFolKLd5uqk60U3minX31Zhi4v6Gdbr8ZAlotcUzPSmFKxiRm5KSSlWoLBn1O++lA0JFiw2rRvoAywTnc5h6EIiLjkALCseCaDx+/DP5uiB9dh9Vzau0PCDWDUIZwsqOHLYda+OBgMx8eaqGm2QdAlt3G/KIsri7OYn6xk6mZ6jIqMiFNucxcBrzjtdAGhE37INOlDsYiEdLt7+NQoy84I7CyPwwc+GAQIMueSFl+KiuvclGan0ZpXirFOXZtISIyXA437F4PhgFqpCMi44wCwrHgmg9bn4PjO6HwyvA8hmYQyjl09vTx0WEPmw818+HBFiqOn8IwIMVm5Uq3k7uvcrGg2MnM3FR1BBQR8w3N3Lvht49BUxVkh2jGX9M+7T8oMafb30d1k48DjV4ONrTT1uUnbVIC6ZMSSEuKN48DP/cfU2zWsL7eGoZB/amu/lmBbcFlwtVNPvz9e+3Z4i2U5Nr57IxsyvJTKc1LY2ZeKtmpYfogW2SicBZB9ynobIVkR6SrEREZEQWEY6Gw3DzWbg5fQNhaA5McMCkjPOeXccPfF2BX3Sk+PNjMBweb+VOt2VgkwRrH3MJMvn5dCQuKnVxakEGCVR37ROQsLlkG//NP5izCz31n9OdTB2MZ57p6+zjU5OVAg5cDje0caPBysNHL4RYfA/0tLHGQYov/s068n2a1xJGWFH9GkDgQIJqXnf757EHjma/dvm4/VQ3tVPUvDx5YJtzWdbqGKRmTKMtPZcmsXErz0ijLT2WaM4V4/R9AJPQcbvPYckgBoYiMOwoIx0JKljlrovZDWPi34XkMT7WWF09QA41FzECwhW3VLcE3J7Py07h3vosFxVlcMd1Bsk1/5UVkGOw5UHIjfPIGXLcGrAmjO5+n2uxgnFMWmvpEwqSjx8+hRh8HGtvZ3+DlYGM7Bxq9HPF0YPQHgfGWOKZlpTAzL5VbL53MjBw7M3LtTM9KITHeSl/AwNvl51RnL21dveaxs/fPfh58/fFTnbR1+mnr7D1rA5AzTUqwkj4pgUCfn0bf6WYIKTYrpflpfP7SyZTmpVKan0ZJbirpk0b591dEhs9RZB491VDwmcjWIiIyQkoLxoprPux6EwJ9YAnDPi6eGpiqF6GJwDAMDjV52XKoha3VHrZWt9Di6wGg0JHMrZfms6C/sYjTrqVCInKB5t4NVb+GA/8DpTeP7lxN+8xjqJYri4ySt9vPwUYvBxrazWOjl/0N7Rxr7QzeJsEahzvLzuwp6dw2dwozclIpybXjcqactwOv1RJHenIC6ckjD+YMw6DbHzh/qNh/eZPnJHcXm2FgWX4aUzImYVGTEJHIynQBcWpUIiLj0pABYSAQ4PHHH6eqqgqbzcaTTz6Jy+UKXv/KK6+wfv16HA5zCvW3v/1tCgoK+Na3vkVdXR0Wi4XvfOc7FBUVhW8U40Fhf6OSE7th8pzQnruvF04dM5eEScwxA0EfW6tb+r88NHvNDcXz05NYVJLNVW4n5UVOChza/F9EQmTGEkjJMZcZjzYgVAdjiRBvt5/Kxi52eY/0Lw82lwbXnTwdBNriLRRl25lXmMmyywuYkWunOCcVlzN5zLfiiIuLIynBSlKCldy0pPPetrKykrKyGWNUmYgMS3wipBeYMwhFRMaZIQPCjRs30tPTw7p169i5cydr167l+eefD16/Z88ennnmGWbPnj3oPn6/nzfeeIPNmzfz/e9/nx/+8IfhGcF44erfh/DIltAHhCePgNGnJcYxwjAMapp9bKk+PUNwoMNgXloSC2dkcZXbwVVuJ4WOZDUWEel3IR9oud1ufvSjH/Hee+/R29vLnXfeyRe/+MVIDSG6WBPg0mWw9XnwNprLji9UU6U6GMuYafF289u9Dby1u54th1r6G3McJzHeQnGOnSumOyjOsfcvDU6lIHOS9uMTkdBxuhUQisi4NGRAuH37dhYuXAjAnDlzqKioGHT9nj17ePHFF2lqamLx4sV85StfYfr06fT19REIBPB6vcTHayUz6VMhw2U2KrnqwdCeWx2MxzXDMDjc0sHW6pb+ZcMtNPYHgjmpicwvclLudnKV24nLqUBQ5Fwu5AOtbdu2sWPHDl5//XU6Ozt5+eWXI1F69JpzN3z4Q9i1Dub/zYWfp6kKsrX/oIRPY3sXv9nTwNu769la3ULAAJczmS8vdJNn9XLtZbOYkjkJq5bgiki4OdxQ8R+RrkJEZMSGTO68Xi92uz34s9Vqxe/3B0O/W265hRUrVmC32/nqV7/Kpk2bKC0tpa6ujptuuonW1lZeeOGFIQvp7u6msrJyFEMxdXV1heQ84ZCfcRH26j9wYO9eGGHIc75xZR7YQh5woMWPvyM6x34+0fycjdbZxmYYBvXtfnad6GRXQxe7TnTS0tEHQOYkK5fmJbFsdiqX5k1icmp8fyDoo7PJx76mCAziLCbacxYrxuPYysqGHypdyAdaH3zwASUlJTz00EN4vV6+8Y1vDPk4E+H16kwu52ysW/+V6ozrhv3aNWhsAT+lzftpcVxG0zgY7/mMl+fsQozHsbV0+Nlc6+MPtT72NHRhAFPTElh2cQZXu1KYnmkjLs6gq8uKr7GW/Y2Rrji0xuNzNlzjcWwjeb2SGOcogq6T0OFRJ2MRGVeGDAjtdjs+ny/4cyAQCIaDhmFw7733kpqaCsCiRYvYu3cvW7du5eqrr2bVqlXU19dz7733smHDBhITz90wITExMSQvrOZ+LFH6At15Mxx+i7Js64g3aj/vuGo7ISGZGXOvHnHwGA2i+jkbpcrKSkpLSznq6WRLdXNwyXD9qS4AsuyJzJ+RG1wy7M5KGRczBGP9OdPYxqcL+UCrtbWV48eP88ILL3Ds2DEefPBB3nnnnfP+PZwQr1dn8n0Z/vvrlKV1wtTLhnWXQWNrqoKAn6yyq8kaD+M9j3HznF2A8TK2upOdvFNxgrd31/NxbSsAM3NT+dr1Bdx8cT4zcuyf+vs7XsY2UrE6LojtsckE4HCbR0+1AkIRGVeGDAjnzZvHpk2buPnmm9m5cyclJSXB67xeL7feeitvvfUWycnJbNu2jdtvv52KigoSEszObenp6fj9fvr6+sI3ivHCNd881m4ObSfH1hpzefE4CJYmgm5/HwcavOw5forf7myk8j+PczwYCNq4sn+5cLnbSVH2+AgERcaDC/lAKyMjA7fbjc1mw+12k5iYiMfjwel0RmQMUWn2X8A7/wA7fjbsgHCQxv5ZQNmloa1LJoyjng7erqjnrd0n2Hn0JABl+Wn83edKuHF2PsU59iHOIBJdhtozd9euXaxduxbDMMjOzuZ73/seCQkJ572PRJEzA8Kpl0e2FhGRERgyIFyyZAmbN29m+fLlGIbB008/zYYNG+jo6GDZsmU88sgj3HPPPdhsNsrLy1m0aBGXX345jz76KCtWrKC3t5dHHnmE5GRtTI7DDfZcqN0Cl98fuvN6qsFZHLrzybC1+nqorG9jb30be4+bx4ON3v4N0SE9ycLVM3J5sH+GYPFZZjaISGhcyAdagUCAn/70p9x33300NjbS2dlJRkZGBEcRhZLSYdYXoOLf4YanR95opKkKs4NxyZA3FRlQ0+zj7Yp63t59gt11pwC4eEo637hxJjfNzmd6VkqEKxS5cOfbM9cwDFavXs2zzz6Ly+XizTffpK6ujoMHD553n12JIpnTgDg1KhGRcWfIgNBisfDEE08MuqyoqCj4/dKlS1m6dOmg61NSUvjBD34QohJjSFycOYuwdjMYRmhm/AUC0HoYiq8f/bnknAIBg6OtHcEQcO/xNirr24IzAwFy0xKZlZ/GtaU5zJqcxqz8NLqajjBr1qwIVi4ycVzIB1oAH330EXfccQeGYbBmzRqsVmuERxKF5t4Nu96Ayg1mZ+ORUAdjGaaDjV7e3l3PWxUnqKxvA2BOQQaP3lzKTbPzKXDoz5DEhvPtmVtTU0NGRgavvvoq+/fvZ9GiRbjdbtatW3fefXYliiQkmQ0qWw5FuhIRkRFRe+Gx5loAe34JJ4+Yb5hGy3sC/F2np7LLqHX19rG/of1TYaCvx1wmb7XEUZSdwhXTHcyanEZZvvmVZf/0HpuVzZotKDJWLuQDLWBYjUkmPNcCyHDBztdGHhA27lMHYzkrwzDY3+Dlrd31vF1Rz/4GLwCXuzJZfessbpydx5SMSRGuUiT0zrdnbmtrKzt27GD16tW4XC4eeOABZs+ePeQ+u+cSisZa47FpzHCFa2yFSblY6vZwOIK/t1h93mJ1XKCxjUfjdVzn2udXAeFYKyw3j7UfhiYg9NSYR8f00Z9rAmr2dgcDwIEw8FCTl/4VwtgT4ynLT+WOy6YGw8CS3FSSEjTDSEQmEIvFnEW46Slz1nrmtOHdr68XWg5CyQ3hrE7GEcMw2Fvfxtu7T/BWRT3VTT7i4uCKaQ6+/b8u4oaL8shLT4p0mSJhdb49czMyMnC5XBQXm9sHLVy4kIqKivPe53xC0VgrlpvGhG1sBy+Gvf8Z0d9brD5vsTou0NjGo1gblwLCsZYzy9zP6ciHMOfO0Z9vYG+LTAWEQ2ls7+KPNZ5BMwMb27uD109OT2LW5DRump0XDAMLMpOxWDQLUESES++ETU/Dzn+Dax4d3n081RDohZzY+Y+TjIxhGBxq8rGluoWt1S1sq26h2duDJQ7Ki5zcv2A6n7sol5xUhYIycZxvz9yCggJ8Ph+1tbW4XC4+/vhj7rjjDgoLC895H4lCziLobIUOjzoZi8i4oYBwrFksUDjfnEEYCq01YImH9ILQnC+G9AUMdh07yaZ9jWyqagpuch5viaM4x87VM7KYlZ8W3C8wI9kW4YpFRKJYRgG4F5sB4aJvma9nQ1EH4wnHMAyqm31srW5hy6EWtlZ7aPaaH8blpSWxcEY25UVOrivNwXmWrTlEJoKh9sx96qmnWLVqFYZhMHfuXBYvXkwgEPjUfSSKDWz/1FqjgFBExg0FhJHgmg/734b2BkjNHd25PDWQUQhWPZUApzp6+d2BJt7f18j7+5vw+MxZCnMLM/n7G2aycEYWM/NSSYzXEmERkRGbezf8+19Cze+g6Jqhb68OxjHPMAxqmn1srfawtX+W4MDs/Ny0RK4udnKV20l5kZNCRzJxoWjQJjLODbVnbnl5OevXrx/yPhLFBgLClmqYcllkaxERGSalSpHgWmAej3wIF902unO11kzo5cWGYVDV0M57+xp5f18T24+00hcwyEhOYHFJNteU5vDZGdlkpmh2oIjIqJXeam6TseO1YQaE6mAcawzDoLalI7hkeGt1Cw1tZiCYk5pIeZEZCF7ldjLNqUBQRCaozOlA3OntoERExgEFhJGQfwkkJJvLjEcbEHqq4eKJ9alUR4+fzQdb2FTVyPv7Gjl+qguAWflpPLioiGtKc5hTkIFVeweKiIRWQhJc/P/An35q7q00KfP8t1cH43HPMAyOeDoGLRk+0Wa+7manJvaHgQ7K3U6mZ6UoEBQRAfP1Mm0KeA5FuhIRkWFTQBgJ1gQouAJqtwzr5l29fbR2+j99RYcHuk5NiBmEtS0+3tvXyHv7GtlW7aGnL0CKzcrVM7J4+LoZLJ6Zo66HIiJjYe5d8NFLUPHv8Jkvn/t2Ax2MZ944drXJqBmGwVFPZ3B24JbqFur7P4jLsidyldsRnCFYlK1AUETknJxuzSAUkXFFAWGkuBaY3SDPmIHRFzA/pa860ca+E+1U9X8dbvERMMD1bjPl/fv4lLud5LTXmOca2OMihvT4A/yxxsOmqkY27WukutkHgDs7hZXlLq4tzeEz0xzY4oexSb6IiIRO/hzInW0uMz5fQDjQwVgNSqJaIGBwuMXHbw+089LunWyr9lB3shMAZ4rNDAOLnJS7HRRl2xUIiogMl8MNe38V6SpERIZNAWGEnMz+DBkY/Oad/2Kjfy5VDe3sb2inqzcAQFwcuBzJzMxL5dZLJ9NxqoXajgR+vbueNz46CsCXM7bzGPD7FjuzfT04xvk+eydOdfF+lTlLcPPBZnw9fdjiLVzldnJPuYtrSnNwOVMiXaaIyMQWF2c2K3nnW9CwB3IvOvvt1ME46gQCZofhirpT7K47RUXdKfYeb6O921yl4EixcZXbwVcWuSl3OynOUSAoInLBHG7o9AxvSw4RkSiggDDMOnv62N9gzgTcd6KdfSfaqDrRjtfnZXeilZrt/8OmpCnMzEtlxRUuSvNSmZmXyoxcO8m2009PZWUlZWVl9AUM9h5vY0t1M87tv4Uu+KsNLXRv+B9K81K5yu1kfpGTK6c7SU9OiODIzy8QMKhv66K6ycuv/+Rh12//wN76NgAmpyexdO4UrpmZw/xi56Dfg4iIRIGL/x/47WrY8XO48emz36ZpH+pgHDl9AYPqJi+7/ywM9PX0AZAYb6EsP42lc6cwe0oaab2t3HDVJVi0f6+ISGg4+jtTe2pgigJCEYl+Sl5CpK9/ic5AEFjVHwTWejowDPM2kxKslOTaua4sh5l5xXR9Moe/jK/nga8sGfbjWC1xXDw1nYunpoOnF+NQPq/fv5gth8zNw9/46Ag/+fAwcXFw0eQ0yt1O5hdl8ZnpDuyJY/90t3f1UtPso7rJR3WTl0P93x9u9tHZa75JscTB5dMcfPPGUq4tzaEkVzMWRESiWooTZt4Eu96A6x+H+LPMYG/aB5nT1MF4DPj7Ahxs8rL72Cn2HG9jd38YOPA6m5RgYVZ+GndcNpXZU8z/QxRn24m3nt6mo7LSp3BQRCSUBraB8lTDlHmRrUVExr+TRyAlGxImhe0hFBBeoAMN7bxf1WSGgQ1tHGjw0u03lwdb4mBaVgqzJqdx29ypzMxLpTQvlUJH8uD/fHctgg+fhR4f2C5g6aynhjiHm3mFmcwrzOSha4rp9vex88hJtvR3G3z1w1pe+kONGSxOSWd+kbmH4eUuB5Ns1pD8Lvx9AY61dlLd7KW6yceh/jCwutlHU3t38HaWOJiamYw7O4VytxN3dgru7BTi209wxZzZIalFRETGyNyVUPkr2P8OzPpfn76+cZ+WF4dBb1+AAw3e08uEj5+isr4tuEVJss3KRZPTWH5FAbMnm2FgUbYdq8I/EZGx5ehvJKlGJSIyWicq4MfXwTWPwoKvhe1hFBBegPerGvnKz7bT7Q+Qk5rIzLxU7il3MTMvjdK8VIpz7CQlDCN8cy2AD/4PHPsI3ItHXkhrDRRdN+iixHgrV7qdXOl28vXrzQ7I22tbzRmG1S28+Ptqnnv/EAnWOOYUZFBelEW528ncwowha/b4eszgr8nHof4wsLrJyxFPB719RvB2GckJuLNSWFSSbYaAWXaKslModCaTGP/px6isbBr52EVEJLKKroXUfLNZyZ8HhAG/OhiHQI8/wP6G9kF7BlaeaKen/wNJe2I8syancdeVLi6eks7sKelMz0pRGCgiEg0SJkHaFGg5FOlKRGQ8626HN++FpAy4dEVYH0oB4Qi9U1HP37y+g5LcVH587+Xkp49iemfBFRBngdoPRx4Q9nRAez04pp33ZkkJVhYUZ7GgOAsAX7efjw57gjMM/+W9Azz77gES4y3MK8xkfpGTy6Zl0tbZ2z8T0EdNszkb8GRHb/C8CdY4XM4UirLtLJmV1x8EpuDOto/7ZikiIjIM1ni4dDls/gG01UNafvAqW/vR/g7GZREscHw66ung17vr+c2eE+ypa6OnzwwDU5PimT05nXvLXeYy4SnpTHOmaFmwiEg0c7g1g1BELpxhwIavm/+O3LsB7NlhfTgFhCPwyx3H+Ls3dzGnIIOXv/QZ0ieNsglIUhrkXWwGhCPVetg8Zk4f0d1SEuNZPDOHxTNzADjV2ctHNWZg+OGhFv73/+wfdPuc1ETc2SncfHF+fwBozgicmjlp0N5FIiIyAc25Gz74Z3MvwqsfCV6c2FZjfpM9M0KFjS8DoeCvd9Wzu+4UAJdOTee+q6eZMwMnp396mxIREYl+Djfs+3WkqxCR8Wr7T6BiPVz7GEy7OuwPp4BwmH6+rZbH/rOCcreTl+65nJRQNfxwLYCPXwZ/z9k3eT+X1v43XwOb316g9EkJXD8rl+tn5Zqn9fXwybGTOFJsTM9KITUpejshi4hIhGUVQ2G5ucx4wdehv8FU4qlq1MH4/M4VCj56cyk3zc6nwKHmLiIi457DDR3N0HUKktIjXY2IjCf1u+Dtb5rb+ly9akweUgHhMPz4D9U8+etKri3N4bm75g1vf8Hhcs2Hrc/B8R1QeOXw7+cZCAhHNoNwKJkptuDsQhERkSHNuQt+9VU4+sfg61hiW406GJ/FQCj41u56dh1TKCgiEvOcRebRUw2T50a2FhEZP7ra4M0vQbID/uIlsIzN6k0FhOdhGAbPvnuQf964n1suzuefl83BFh/iJ6aw3DzWbh5hQFhtblI5KTO09YiIiIzERUsx3v4m7VteYXvndOpPdnGL5xDGlDK0IPbcoeA/3FTKzRcrFBQRiWkDq71aDikgFJHhMQzY8DVz1eiXfg0pWWP20AoIz8EwDL779j5e/H01d1w2lWduvyQ8XQFTsiC71NyHcOHfDv9+rTUhnz0oIiJyNoZh0NTezdHWDo54OjjS0skRTwdHPebPf9t1OTfv/SUP7VhCD/HckXiUnxyYy543P+H6shyunpGNPVRbc4wDCgVFRAQ4vV/8wOovEZGhfPwy7PkPuG6NueJ0DE2c/62PQCBgsOZXFby29Qj3lLt4/PMXhXdj8MJyqPh3CPSBZZjLlz01MGVe+GoSEZEJpaPHz1HP4OAveGztoKs3MOj2eWlJFDqSWVCcRZx1Jfbdv+Ot61tIdH0G28/7sOaW8ds9J1i//Rg2q4Ur3Q6uL8vlurIcpmbGXkB21NPBW7vr+bVCQRERGWBLhtTJ6mQsIsNT/wm88w9QfD0seGTo24eYAsI/4+8L8I1/38V//KmOBxYV8c0bZxIXF+ZFUq4FsP0VaKiA/EuHvn1fL5w6CrNvD29dIiISM/oCBg1tXeYMwP7wbyAAPOLppNnbPej2KTYrBY5kpmelsKgkm0JnMgWOZAodyUzJmDR4P17jEqj7LtOO/ifkm/vY3vOFG7kz52I+PtzKe/saeLeykX/61R7+6Vd7KM1L5bqyHK4ry2XO1Ixx251XoaCIiAzJ4QbPoUhXISLRLrjvoBNu+9GY7Tt4piEDwkAgwOOPP05VVRU2m40nn3wSl8sVvP6VV15h/fr1OBwOAL797W/jdrv50Y9+xHvvvUdvby933nknX/ziF8M3ihDp8Qf42hs7eLviBH/3uRIeuqY4/OEggGtgH8IPhxcQnjoKAb+WGIuIyJDer2rkO/+9l6OeTnr6Ts8CtMRBfvokCh3JXFeaMygALHQkk5mcMPzXwLg4mHsXvPsEpE/FII445wwSrBbKi5yUFzn5x1tmUd3k5d3KRjZWNvDC76r5v5sOkWW3cc1MMyxcOCOLlChfijwQCr61u55P+kPBSxQKiojIuTjdUPV2pKsQkWhmGLDhYWitHfN9B8805P/CN27cSE9PD+vWrWPnzp2sXbuW559/Pnj9nj17eOaZZ5g9e3bwsm3btrFjxw5ef/11Ojs7efnll8NTfQh19fbxwGvbeb+qidW3zuIvrx7D8C19KmS4zEYlVz049O0H9rDIVEAoIiLn9snRkzz42p+YkjmJ+66eFgz/Ch3JTM6YRII1hJ9MXnonvPck7PoFvfYp2M7SwdidbcedbeevPuvmZEcPv9vfxLuVjfxmzwne7F+KfFWRk+v7ZxdOyZgUuvpGwDAMmr09HG3t4FhrJ0c95vHjQw0caDGXiV0yNZ1v3VTKLQoFRUTkfBxu8DWZs4OS0iJdjYhEo49+DHt+Cdc/fnoCWQQMGRBu376dhQsXAjBnzhwqKioGXb9nzx5efPFFmpqaWLx4MV/5ylf44IMPKCkp4aGHHsLr9fKNb3xjyEK6u7uprKy8wGGc1tXVNeLzdPQG+PZ7J9h9oouHy7OY7xz5OUYrP+Mi7NUfcGDvXnMmxp85c1wZB7eQDxzw9OHvHNs6w+FCnrPxIpW1tSgAACAASURBVFbHFqvjAo0t2pSVlUW6hHHrSEsHf/nqRzjtNv7tr64kJzUpvA+YNtncL+XAb+lOm45tiJtnJNv4wpwpfGHOFHr7Anx8uJV3Kxt4d18ja/5rD2v+y1yKPLBv4aUhXIpsGAanOns56unsDwE7OOrpNI+t5vHP91x0ptjITYlTKCgiIiMz0MnYUw2T50S2FhGJPsd3wm8ehRmfg/lfi2gpQwaEXq8Xu90e/NlqteL3+4mPN+96yy23sGLFCux2O1/96lfZtGkTra2tHD9+nBdeeIFjx47x4IMP8s4775x3qVJiYmJI3ghWVlaO6DynOnr50k/+yJ7Gbr6/fA5fmDNl1DVckM6b4PBblGXHQ3bJp64eNK4jnRA/iRlzF541TBxvRvqcjSexOrZYHRdobBIbWn09fOmVP9LbZ/DGX18R/nBwwJy7zIAwfTqpI7jbmUuRH7t1FoeavLxb2cDGykae/90h/mXTQbLsiVxbmh1cipxsO/9/Ydq7eoOz/wZCv4EQ8FhrJ95u/6Dbp09KYGrmJIqz7SwuyabAkczUzEnBY7Itvv/vUNEF/GJERGTCcvS/biggFJE/13XK3HcwJRuWvhCRfQfPNGRAaLfb8fl8wZ8DgUAwHDQMg3vvvZfUVPNtwKJFi9i7dy8ZGRm43W5sNhtut5vExEQ8Hg9OpzNMw7gwLd5uVv7rHznY6OW5u+Zxw0V5kSvGtcA81m4+a0A4iKcGMqfFRDgoIiKh1dXbx5d/+jHHTnby8y9fSXGOfeg7hcrMm+HSFbTlXsdodk4pyrZTlG3nrz9bFFyKvLGykbcrTvCLj49hi7cwv8jJdaU5TMmcNGgZ8MCy4JMdvYPOmWyzUpCZTIFjEle5nYPCv6mZyaRPShjd2EVERM5mYN94NSoRkTMZBvzqb+DkEbjvLUiJfF42ZEA4b948Nm3axM0338zOnTspKTkdXnm9Xm699VbeeustkpOT2bZtG7fffjuBQICf/vSn3HfffTQ2NtLZ2UlGRkZYBzJSJ051cdePt1J3spMf33s5ny3JjmxBDjfYc81GJZffd/7bttaoQYmIiHxKIGDwyLqd/OlIK/9y5zw+M80xtgXE2+C25+kO4VL2P1+K/NFhD+9WNvJuZQOr/2tP8HaJ8ZZg2DenIIOpmcnBQHBq5gibroiIiISKLQVS80/vIy8iAua+g3v/C67/NhReFelqgGEEhEuWLGHz5s0sX74cwzB4+umn2bBhAx0dHSxbtoxHHnmEe+65B5vNRnl5OYsWLQLgo48+4o477sAwDNasWYPVag37YIbrqKeDFT/eSquvl5/efyVXTB/jN1BnExcHrvnmDELDOPfsQMOA1sNQdO2YliciItHvqbcqebviBI/dUsYtl+RHupyQS7BamF+UxfyiLB67pYzqZh8nO3opyJxElj0xZHsUioiIhJTDDS2aQSgi/Y7v6N938AaY/3CkqwkaMiC0WCw88cQTgy4rKjq9/87SpUtZunTpp+43nMYkkXCw0cvdP95GZ28fP//ylVxaEEUzGwvnm51rTh6BTNfZb+NtgN4Oc4mxiIhIv5c/qOFfP6jhS/On8ZdXx/4s87i4OIqyx3D5tIiIyIVyTIf9v410FSIQCMCffgK7fgEX/QVc9iVzBYiMnc6T8It7ISUHbov8voNnip5KxkBlfRvLfrQFfyDAG399VXSFg2DOIAQ4suXct/FUm0ctMRYRkX5v767nO7/eyw0X5bL61llaSisiIhJNHEXga4SutkhXIhNZwx54+Qb470egtRbe/nv4l8vgkzcg0Bfp6iaGgX0H2+rgi69AchSsZj3DhAkIdx49yfIXt2KLt/CLr5RTlp8W6ZI+LWcWJKWby4zPZWDvikwFhCIiAttrPXx93U7mFmTwg+VzsWqZrYiISHSZPNc8vnqrubRQZCz1dMDGx+FHn4WWg2a33L/dC3f/O0zKhF9+BZ5fAPt+bQZYEj5/fBEqfwXX/RMUXBHpaj5lQgSEW6tbuOulraRPSuAXXynHHa1LkiwWc5lx7Yfnvk1rDcRZIaNw7OoSEZGoVN3k5cuvfszkjEn8+N7PkJQQPfv9ioiISD/3YvjiT6D9BLx0Lbz9Lehuj3BRMiEc3AjPXQUf/DNcshy++jHMudPseVB8PfzV++afzUAvvLEC/nUJ1Pwh0lXHpro/wW/+EUpugvl/E+lqzirmA8L3qxq59+U/kp8xiTcfKKfAkRzpks7PNd9M9dsbzn69pwYyCsCaMLZ1iYhIVGn2dvOlVz7CEhfHT+77DI4U7R8jIjIeBAIB1qxZw7Jly1i5ciW1tbWDrn/llVe45ZZbWLlyJStXrqS6upre3l5WrVrF8uXLWbFiBYcOqeHFuBIXBxfdBl/9CC6/H7a9AP/3SnPGlkg4tDfA+vvhtdvBaoN7/xuW/l9IcQ6+ncVi/tn8f7fB55+FU3XmTNef/QUc3xmZ2mNR50l480uQmgdLnzt3U9oIi+mA8J2KE/zVTz+mOOf/b+/e46Mq7zyOfyYJSUgmV+4VCSQIRLBQbmuUmFClSkHJImvS1IDW3aKCFkpdXLZGpZWSbteCtYDBCtsAynppKS2Vl1gKFjAL0VgTRlRiUe4BgjAJJJnM2T8OuXGRS4acmTPf9+s1r8mcueT3kMsv8+U8z+Nk9fdvpFtspNUlXVzTOoQXOIvwWIWmF4uIBLmaOg8PLN/O4ZOneXHKcJI6RVtdkoiIXKINGzZQV1fH6tWrmTVrFvPnz291f3l5OQUFBRQVFVFUVERycjKbNm3C4/HwyiuvMG3aNBYsWGBR9dImkXEw7r/hgbcgMt48Y+uV75qhjIgveL2w4yV4fgS41kLmHHhoC/RJ/+rnhYbBsCnw6HvwrZ/C/vegMMPcTOPIJ+1Tu10ZBqyZZq47OMn/1h1s6aK7GAeq372/lx+9+ncG94xj2f0jiesYIGfc9RgMHaJgzzYzyT9b1WfnPy4iIkHB0+Dl0Zff58N9X7Lk3mF8o1eC1SWJiMhlKCkpIT3dfLM+ZMgQysrKWt1fXl5OYWEhlZWVZGZmMnXqVPr06UNDQwNerxe3201Y2KW9jautrcXlcrWp3tOnT7f5NfyVdWNzQsYLJO56mS7lL2J8OpzKG6ZS1XcShPhmuRC7ft3sOi5o+9giju+m+475RB39kOquwzg47N+pi02CTyou74USbiPkjhtJ3LWKTh+/jMO1luN9xnFk4L/iiep6RbXZ9et2KeNK+Hg13T/6I4eGPMoxtxP84N8hNTX1vMdtGRCuKv6c//z9h9zYpxMvThlOdEQADTO0g7lY5fnWITx1HE5VQWJy+9clIiKWMwyDp9aWs8F1mLkTBvKtgd2tLklERC6T2+3G6WxeEz00NBSPx9MU+o0bN47c3FycTifTp09n48aNDBgwgH379jF27FiqqqpYsmTJJX2uiIiIC74RvFQul6vNr+GvLB/bwBtg9PfhT7Po/v4v6X7orzB+AXxtSJtf2vKxXSV2HRe0YWx1NbD5v2DrcxARC1lLiB6cQ0pbp7EOHgHuOfDOf5Ow4zck7FkPI/8NRv3w3KnKF2HXr9tFx7W3BD54Hvp/m24T5tLNT6cWN7LdFOM3yo8z53cfMrp/V5bdPyKwwsFGSTfDoTIzDGypSjsYi4gEsxc2V7Di3c+Zeksyk9N6W12OiIhcAafTSXV1ddNtr9fbFA4ahsGUKVNITEwkPDycjIwMdu7cyfLlyxk1ahTr169nzZo1PP7449TW1lo1BPGlhN7w3ddg0kvmVOOlo82NDGrdVlcmgeDTDbA4Df72LHw9u/UmJL7g7AJj58MjJXDDJHh3ESwcDH8t0EY7F3OqCl67D2J6wIRf++26gy3ZKiB87u1PWLrjGONu6MGSe4cF7m6OvdIAAz4vbn382JlTgxMVEIqIBJs1pfuY/+ePuHPw15h9xwCryxERkSs0dOhQNm/eDEBpaSn9+vVrus/tdjN+/Hiqq6sxDIPi4mIGDRpEbGwsMTExAMTFxeHxeGhoaLCkfrkKHA4YdLe5icnQKbDteXMTk11/troy8VcnD8FrD5ibkISEndmEZNFln9l3yeJ7ma//0DZIzoC/zoOFQ+DdxeDRf1acwzDg99PgxH74F/9ed7ClADy97vxq6jw8/5dPuS3FycKcIYSFBnD22XM4hHQwNyrpf0fz8WONZxD2tqQsERGxxrsVR3ns1b8zsk8iv/iXrxMS4v//AykiIuc3ZswYtmzZQk5ODoZhMG/ePNauXUtNTQ3Z2dnMnDmTyZMnEx4eTlpaGhkZGQwfPpw5c+aQm5tLfX09M2fOJCoqyuqhiK91jIc7F8Dg78DaH8DLOZB6J4z9OcR+zerqxB94vfDe/8CGJ6H+FGT+B4yaCWER7fP5uw6AnJWwdwe8/TS8+Ths+7VZx+Acn62hGfDeXQy7/gS3zzPznQBhm4AwKjyMd+fcysE9nwZ2OAjQoSNcM+zcdQirPgNndwjXbpUiIsHik0Mn+f5vd9CrUxRL84YTEaY/vEREAllISAhz585tdSwlJaXp46ysLLKyslrdHx0dzcKFC9ulPvEDvf4Jpm42zyTcVAC7R8Kt+TDiAQUwwezQTvjjDPiiGHqnw/hfQufrrKml53CYshZ2bzSDwjUPw5aFcOsTMGB8QEynvWr2lsBb+dB/HNz4sNXVXJYAT9JaS4wOx2GXb8Skm2D/+1DXvD4Jx/6h6cUiIkHk0InT3LdsOxEdQll+/wjiojpYXZKIiIi0h7BwSP8hPLwNrh0Bf34MXrwNDvzd6sqkvdWfgg1PwwvpcOQTyFpshnNWhYMtpYyGf9sI9xQBBqy+F168FSo2WV2ZNWqOwav3QWwPyAqMdQdbslVAaCtJN4PXA3u3Nx87VqENSkREgoS71sP9y7ZTVVPHsvtG0DNBU8lERESCTmIy3PsG3P0b+PILKMw0NzFpeSKJ2Nenb8OiG8/ahCTXv4InhwOuv8tcn3DCr831EX97F/x2Auwrsbq69mMYsGYanDwAk5ZDxwSrK7psCgj91bUjwRHSNM3Y4TkNJ/frDEIRkQvwer3k5+eTnZ1NXl4ee/bsaXX/smXLGDduHHl5eeTl5VFRUdF039GjR8nIyGD37t3tXfZ51Td4eXjle+w6dJJF3x3KoGvirC5JRERErOJwmDvITt8O37i3eROTj9dbXZlcLe7D8Pq/woqJZzYhWXt1NyHxhdAw8/vzkRK4/Wdw8ENY+k1YfS8xX/wFDnwAp09YXeXVs+3XsGsdfOsn0HOY1dVcEdusQWg7kbHQ/YamgLBD9QHzeGKyhUWJiPivDRs2UFdXx+rVqyktLWX+/PksXry46f7y8nIKCgoYNGhQq+fV19eTn59PZGRke5d8XoZh8J+/+5DNH1cyf+INZPbvanVJIiIi4g86JsBdz5mbmPxxBqy6B67Pgjvmm1MaJfB5vfD+b8017OpPQcbj5iYkHfzj79RL0iES0h6GoXlmaLb1eXrWrYXGLRaiOpkzIxP7nHvt7OZfZ0deqi+2mxvHDBgP//Sg1dVcMQWE/izpZtjxEnjqCHfvNY9pirGIyHmVlJSQnp4OwJAhQygrK2t1f3l5OYWFhVRWVpKZmcnUqVMBKCgoICcnh8LCwnav+Xyee/tT/nfHXh75Zl9yRvayuhwRERHxN0lpMPUd2PocbPo57P6LuYnJ8O9pE5MAFv5lBSybAV+8C0mjzE1IuvSzuqwrFxEDmY/DTY9QseMtkuMwN1499pl5/UUxlL0Ohrf5OWEdIaH3+cPDuGvNtTn9Tc0xeO1+c6fxCYG37mBLCgj9WdJN8O4i2P9+c0CoKcYiIufldrtxOp1Nt0NDQ/F4PISFma1u3Lhx5Obm4nQ6mT59Ohs3bqSqqorExETS09MvOSCsra3F5XK1ud7Tp0+f8zpvfXqSX26p5NYUJ2N7Nvjk81jhfGOzA7uOCzS2QGTXcUFgji01NdXqEiTYhIXDLT+Cgf8Mf/ohrPsRfPAK3LkQug+6+PPFPxz/HD7bDBV/JbnsDXMm4YRF/rfOYFuER1Ob0B/O93vSU2eurdkYGra83r0RPKeaH+sIgbie5z/7MKG3+W/X3gwDfv8wnDwID6yHjvHtX4MPKSD0Z73SzOs9W+jg3gcRcQG50KWISHtwOp1UVzcv2O31epvCQcMwmDJlCjExMQBkZGSwc+dOtm7disPhYNu2bbhcLmbPns3ixYvp0qXLBT9PRESET94IulyuVq/zzieVPLftM0b17czi+0YQHha4ywSfPTa7sOu4QGMLRHYdF9h7bCI+1ykF8n4PH74Kb/4HvHAL3DSdsITRYAywT8hkF+7DZiDYeKn6zDwe3YXjyXeRMPEXEN3Z2hrbU1i4+T3cKeXc+wzDDN7ODg6r/gGutVBztPXjG6cux/aA0AgIizRfPzSi9XVY5LnHLvj4M5ezj535uUrctQo+/jOM/TlcE5jrDrakgNCfRXeGzv3h822Eu0+Y6bh+wYuInNfQoUPZuHEj3/72tyktLaVfv+YpGW63m/Hjx7Nu3TqioqIoLi7m7rvvZtq0aU2PycvL46mnnvrKcPBq2bn/BA+teI++XZ0sundoQIeDIiIi0s4cDvj6PdD3NnMdtC0LuY6F8FYcdBtonlHYbSB0GwRdUyE82uqKL5/XCycPEHnMBTXdICrR6oouzanjsGdLcyB4eKd5PCIOeo8y16vrcwt0TeXgRx+REEzh4MU4HGbYF9vDnF15ttNfmmHh2WcfHvkEPLXQUHfWda3vagvpAGGRdK1zQ+pdMPL7vnttCykg9HdJN0HZ64SHxUDvkVZXIyLit8aMGcOWLVvIycnBMAzmzZvH2rVrqampITs7m5kzZzJ58mTCw8NJS0sjIyPD6pIB2H/8FPcv/z+cEWEsu38EsZEdrC5JREREAlFUItz1Kxg5lQPb19DDcRQOlUHpKqhzn3mQw9z4sjEwbAwP45OsPxml8YyxY7vh6O4W15/BsQrwnKIPwFtAdFfoOgC6tLh0TbU+OKyrgc+3NQeCB0rNNfbCOpprR379HjMQ7DFE60W2VWQc9BhsXi6FYZw/NPTUnudYHXhOX/TxR0/U0Pmuudb/7PiIAkJ/l3QzlCwjvPaENigREfkKISEhzJ07t9WxlJTm6QpZWVlkZWVd8PlFRUVXrbYL+fJUPfcv205NbQOvPpRGj7iO7V6DiIiI2Ez3QRzvG0qPxqn6Xi98+TkcKoeDZWZoeKjcnKaJYT4mPOZMaDiwOTzsdr250YQvGYY5zbYp/Ks483GF+XF983IxhHQw15brlALJmdApmb3H6+gZ5YHKj8xLq/ATiO7SIjBsDA9TIbqTb8fRyFMH+3Y0B4Jf/B94683ae46AW/7dDAR7Djenpop1HI7mKcM+Uuly0TkyzmevZ7WLBoRer5ennnqKXbt2ER4ezk9/+lOSkpKa7l+2bBmvvfYaiYlmUv/000+TnJwMwNGjR5k4cSIvvfRSqzdpchmS0po/1gYlIiK2Ud9g8GBRCRVH3Cy/fyQDuluwsLKIiIjYX0iIGbQl9IYB45qP17rNkK0xMDxYBh++Bjt+0/yYhN5nwsKBzdcJfczXvBDDgOojZvB3rOLcswHrTraoLcw8e7FTijnltlOKeYZjpxSI7QmhrSOLky5X680uDAO+3AuVu6DSZY7n8Efmhi0tP09UZ/MMwy79W59xeLlTer0NcOCD5kDw821QXwM4zDPZ0h42A8FeaYE5lVuC2kUDwg0bNlBXV8fq1aspLS1l/vz5LF68uOn+8vJyCgoKGDSo9U5J9fX15OfnExkZ6fuqg0lcT4jvZe5ulJhsdTUiIuIDhmGwYGsl2yrcPHvPYG7uq/VmREREpJ1FOM0z23oObz7WGLgdKodDH565Lodd68ypsgAdos1wrfsgMzSMiDkrBKyA2hPNr+kINd/Tdkoxg7NOKZCYAp2SIa7XOSHgZXE4IP5a83Ldba3HcWJfc2DYeMbh3/+3dW1RncwzDLv0bxEgngkOHQ7zdSo/ag4E//GOufYdmCHjN/LMQLD3zdpQVALeRX8SS0pKSE9PB2DIkCGUlZW1ur+8vJzCwkIqKyvJzMxk6tSpABQUFJCTk0NhYeFVKDvIJN1sBoSaYiwiYgtL36ngLxVufvStfkwc2tPqckRERERMLQO3/nc0H68/BYddzYHhoTLYuQZKlp95XogZAiYmm1Nrm0LAFPN4aDuvsexwmCfbxPU0N29pZBhw8oA5lqazDneZZ07Wftn8uI6J0Pk684zH6sPmsfgkuH4C9MmA3ukQ0619xyRylV00IHS73TidzqbboaGheDwewsLMp44bN47c3FycTifTp09n48aNVFVVkZiYSHp6+iUHhLW1tbhcriscRrPTp0/75HX8ScdOmcRce4zD+47D/hMXf0KAsePXrJFdx2bXcYHG5m9SW04hsZGOHUK5d0gC00b3tboUERERkYvr0BGuGWpeGhkGnNhvTrGNT4KwcOvqu1QOB8R+zbz0vbX5eOMGKY2BYeVH5m64yRlmINgn3ZxuLWJjFw0InU4n1dXNC4V6vd6mcNAwDKZMmUJMjLlwaUZGBjt37mTr1q04HA62bduGy+Vi9uzZLF68mC5dulzw80RERPjkjaDL5bLfG8rUVFxdBttvXGfY8mt2hl3HZtdxgcYm7SMvrTeu+FM4bLLjmYiIiAQhhwPirrG6Ct9wOCC2h3lJ+abV1YhY4itWFjUNHTqUzZs3A1BaWkq/fv2a7nO73YwfP57q6moMw6C4uJhBgwaxcuVKVqxYQVFREampqRQUFHxlOCgiIiIiIiIiIiLWuOgZhGPGjGHLli3k5ORgGAbz5s1j7dq11NTUkJ2dzcyZM5k8eTLh4eGkpaWRkZHRHnWLiIiIiIiIiIiID1w0IAwJCWHu3LmtjqWkpDR9nJWVRVZW1gWfX1RU1IbyRERERERERERE5Gq66BRjERERERERERERsS8FhCIiIiIiIiIiIkFMAaGIiIiIiIiIiEgQU0AoIiIiIiIiIiISxBQQioiIiIiIiIiIBDEFhCIiIiIiIiIiIkHMYRiGYXURAKWlpURERFhdhoiI+JGwsDCuu+46q8toRf1KRETO5o/9CtSzRETkXBfqWX4TEIqIiIiIiIiIiEj70xRjERERERERERGRIKaAUEREREREREREJIgpIBQREREREREREQliCghFRERERERERESCmAJCERERERERERGRIKaAUEREREREREREJIjZIiD0er3k5+eTnZ1NXl4ee/bssbokn6mvr+exxx4jNzeXSZMm8fbbb1tdkk8dPXqUjIwMdu/ebXUpPvXCCy+QnZ3NxIkTefXVV60ux2fq6+uZNWsWOTk55Obm2ubr9sEHH5CXlwfAnj17+M53vkNubi5PPvkkXq/X4uquXMtxuVwucnNzycvL44EHHuDIkSMWVxe87Nqz7N6vQD0rkKhfBR71LP9j134F9u9Z6leBxY49S/0qMNkiINywYQN1dXWsXr2aWbNmMX/+fKtL8pk//OEPxMfHs2rVKpYuXcpPfvITq0vymfr6evLz84mMjLS6FJ8qLi7m/fff5+WXX6aoqIiDBw9aXZLPbNq0CY/HwyuvvMK0adNYsGCB1SW12dKlS/nxj39MbW0tAD/72c+YMWMGq1atwjCMgP2D8exxPfPMMzzxxBMUFRUxZswYli5danGFwcuuPcvO/QrUswKN+lVgUc/yT3btV2DvnqV+FXjs1rPUrwKXLQLCkpIS0tPTARgyZAhlZWUWV+Q7d9xxBz/4wQ+aboeGhlpYjW8VFBSQk5ND165drS7Fp/72t7/Rr18/pk2bxoMPPkhmZqbVJflMnz59aGhowOv14na7CQsLs7qkNuvVqxe/+tWvmm6Xl5czcuRIAG655Ra2bt1qVWltcva4nn32WVJTUwFoaGggIiLCqtKCnl17lp37FahnBRr1q8CinuWf7NqvwN49S/0q8NitZ6lfBa7A/s47w+1243Q6m26Hhobi8XgC/gcLIDo6GjDH+OijjzJjxgyLK/KNN954g8TERNLT0yksLLS6HJ+qqqpi//79LFmyhL179/LQQw/x5ptv4nA4rC6tzaKioti3bx9jx46lqqqKJUuWWF1Sm91+++3s3bu36bZhGE1fq+joaE6ePGlVaW1y9rga/0h87733WLFiBStXrrSqtKBn155l134F6lmBSP0qsKhn+Se79iuwb89SvwpMdutZ6leByxZnEDqdTqqrq5tue71eWzSuRgcOHGDy5MlMmDCBO++80+pyfOL1119n69at5OXl4XK5mD17NpWVlVaX5RPx8fGMGjWK8PBwkpOTiYiI4NixY1aX5RPLly9n1KhRrF+/njVr1vD44483nV5tFyEhzb8Wq6uriY2NtbAa31q3bh1PPvkkhYWFJCYmWl1O0LJzz7JjvwL1rECkfhX41LOsZ+d+BfbsWepXgcnuPUv9KnDYIiAcOnQomzdvBqC0tJR+/fpZXJHvHDlyhO9973s89thjTJo0yepyfGblypWsWLGCoqIiUlNTKSgooEuXLlaX5RPDhg3jnXfewTAMDh06xKlTp4iPj7e6LJ+IjY0lJiYGgLi4ODweDw0NDRZX5VvXX389xcXFAGzevJnhw4dbXJFvrFmzpuln7tprr7W6nKBm155l134F6lmBSP0qsKln+Qe79iuwb89SvwpMdu9Z6leBwxb/BTRmzBi2bNlCTk4OhmEwb948q0vymSVLlnDixAkWLVrEokWLAHNhTLstOmsno0ePZvv27UyaNAnDMMjPz7fNuib33Xcfc+bMITc3l/r6embOnElUVJTVZfnU7NmzeeKJJ3j22WdJTk7m9ttvt7qkNmtoaOCZZ56hR48ePPLIIwCMGDGCRx991OLKgpNde5b6VWCya89Svwpc6ln+w679CtSzApFd+xXYv2epwqILXAAAAHVJREFUXwUOh2EYhtVFiIiIiIiIiIiIiDVsMcVYRERERERERERErowCQhERERERERERkSCmgFBERERERERERCSIKSAUEREREREREREJYgoIRUREREREREREgpgCQhERERERERERkSCmgFBERERERERERCSI/T9ZMrl6p+xGSgAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 1296x288 with 3 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, axes = plt.subplots(ncols=3, figsize=(18,4))\n",
    "for i, (metric, hist) in enumerate(loss_history.groupby(which_metric, axis=1)):\n",
    "    hist.plot(ax=axes[i], title=metric)\n",
    "    axes[i].legend(['Training', 'Validation'])\n",
    "\n",
    "sns.despine()\n",
    "fig.tight_layout()\n",
    "fig.savefig(results_path / 'lstm_stacked_classification', dpi=300);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Evaluate model performance"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T01:44:00.226293Z",
     "start_time": "2020-06-22T01:43:52.502443Z"
    }
   },
   "outputs": [],
   "source": [
    "test_predict = pd.Series(rnn.predict(X_test).squeeze(), index=y_test.index)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T01:44:00.261060Z",
     "start_time": "2020-06-22T01:44:00.227327Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.6856058141098694"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "roc_auc_score(y_score=test_predict, y_true=y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T01:44:00.266609Z",
     "start_time": "2020-06-22T01:44:00.262143Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.6218607154498662"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "((test_predict>.5) == y_test).astype(int).mean()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T01:44:00.294320Z",
     "start_time": "2020-06-22T01:44:00.267693Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.31755979041009647"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "spearmanr(test_predict, y_test)[0]"
   ]
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python [conda env:ml4t-dl]",
   "language": "python",
   "name": "conda-env-ml4t-dl-py"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.7"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": true,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": true
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
